Страница 1 из 3
Задачка на проектирование БД с интересным ответом
Добавлено: 13 дек 2006, 08:02
Дима
У вас есть табличка каких-то процессов. Каждым процессом владеет либо user, либо group. Юзеры и группы связаны между собой соотношением много-ко-многим и являются разными обьектами с сильно разным набором свойств. Какой дизайн этого кусочка БД будет самым идеологически выдержанным, по вашему мнению ?
Добавлено: 13 дек 2006, 08:30
aldep
Все зависит конечно от требуемых запросов в большой степени, но как пример:
Таблица Owner содержащая Id и возможно общие между пользователями и группами свойства.
Таблицы User и Group которые ссылаются один-к-одному на Owner по Id.
Таблица Process имеющая атрибут OwnerId
Добавлено: 13 дек 2006, 08:30
aissp
Не являяст спецлм в бд рискну предположить: Редуцировать задачу к задаче, зарплата менеджер работник

то есть объеденить группы и пользователей в одной таблице
Добавлено: 13 дек 2006, 08:51
Дима
Я так и знал, что в каморке сидят идеологически выдержанные дизайнеры БД

С точки зрения идеологии грамотно будет создать суперкласс "Владелец процесса", от которого некоторые свойства будут наследовать как юзеры, так и группы. Реализация зависит от конкретной БД; в частности, какие-то об'екты можно хранить во VIEW.
Как часто вы видели идеологически выдержанные базы данных ?

(рассматриваю таблицу процессов, в которой лежит поле "тип владельца" и "id", которое ссылается либо на юзера, либо на группу в зависимости от значения поля "тип владельца")...
Добавлено: 13 дек 2006, 09:17
Vovchik
Я идеологически невыдержан. В лоб - я создам четыре таблицы - юзеры, группы, процессы и их взаимотношения между собой. Ежели в одной четвертой таблице взаимоотношения между тремя сущностями не представляются - то мона наплодить больше таблиц. Главное в логике не запутаться.
Ежели это не нравится - придется заняться сисемным анализом и строить там иерарихии - от юзеров к группам ну и прочая хрень.
А вообще не важно что там выдержано а что нет. Важно - как ты могешь оппонентов которые грят что твой дизайн - фуфло отфутболивать.
Добавлено: 13 дек 2006, 10:45
папа Карло
это делается элементарно....
создается убер таблица... от нее растут юзеры и группы. релейшеншипы между ИД из убер таблице в третьей таблице.
Добавлено: 13 дек 2006, 13:21
Marmot
А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
Добавлено: 13 дек 2006, 13:22
StS
CREATE TABLE processowner
(
ProcessName VARCHAR(30) NOT NULL,
UserID INTEGER,
GroupID INTEGER,
);
AFAIK nullable FKs is not a problem if PKs in user and group tables have only one field - ID.
DISCLAIMER: I'm not a DBA.
Добавлено: 13 дек 2006, 13:34
папа Карло
StS писал(а):CREATE TABLE processowner
(
ProcessName VARCHAR(30) NOT NULL,
UserID INTEGER,
GroupID INTEGER,
);
AFAIK nullable FKs is not a problem if PKs in user and group tables have only one field - ID.
DISCLAIMER: I'm not a DBA.
that's a bad design.
Добавлено: 13 дек 2006, 13:35
папа Карло
Marmot писал(а):А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
управление через группы логичнее, абсолютно согласен, анлесс есть какие либо интересные требования почему так не может ьыть сделано.
Добавлено: 13 дек 2006, 13:40
StS
папа Карло писал(а):
that's a bad design.
Why?
Добавлено: 13 дек 2006, 14:05
Дима
папа Карло писал(а):Marmot писал(а):А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
управление через группы логичнее, абсолютно согласен, анлесс есть какие либо интересные требования почему так не может ьыть сделано.
Ууу, докопались таки

Да, есть причины, по которым юзер не может быть заменен на группу, состоящую из одного юзера.
Добавлено: 13 дек 2006, 14:29
aldep
StS писал(а):папа Карло писал(а):
that's a bad design.
Why?
Потому что тогда одним запросом не нельзя соединить таблицы процесса и владельца.
папа Карло писал(а):
это делается элементарно....
создается убер таблица
А я что предложил?[/quote]
Добавлено: 13 дек 2006, 15:01
StS
aldep писал(а):StS писал(а):папа Карло писал(а):
that's a bad design.
Why?
Потому что тогда одним запросом не нельзя соединить таблицы процесса и владельца.
You mean extra roundtrip to the DB from the application? How about this?
CREATE TABLE process
(
ID INTEGER NOT NULL,
ProcessName VARCHAR(30) NOT NULL,
UserID INTEGER,
GroupID INTEGER,
);
CREATE TABLE user
(
ID INTEGER NOT NULL,
name VARCHAR(30) NOT NULL,
);
CREATE TABLE group
(
ID INTEGER NOT NULL,
name VARCHAR(30) NOT NULL,
);
SELECT group.name as name
FROM processowner
INNER JOIN group ON processowner.groupid=group.id
WHERE processowner.id=processID AND processowner.groupid is not null
UNION
SELECT user.name as name
FROM processowner
WHERE processowner.id=processID AND processowner.userid is not null
Добавлено: 13 дек 2006, 15:29
Vovchik
aldep писал(а):Все зависит конечно от требуемых запросов в большой степени,
Хе-хе. Ежели б знать какие запросы требуются в момент проектирования... Даже ежели все знают через год после ввода так сказать в эксплуатацию вдруг требуется 10 совершенно новых запросов. Вообще канонически модель данных проектируют как отражение бизнес процессов а не чтоб запросы проще писать. Производительность запросов могет правда да страдать зато на апдейт должно все путем быть и гораздо лучше когда какие нить запросы не очень эффективны чем вся модель данных не отражает бизнес процесс и тыда все, боржом пить будети поздно.
Впрочем, амбары данных проектируют как раз наоборот - чтоб запросы быстрее были.