Задачка на проектирование БД с интересным ответом

Все, что вы хотели знать о программизме, но боялись спросить.
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Задачка на проектирование БД с интересным ответом

Сообщение Дима »

У вас есть табличка каких-то процессов. Каждым процессом владеет либо user, либо group. Юзеры и группы связаны между собой соотношением много-ко-многим и являются разными обьектами с сильно разным набором свойств. Какой дизайн этого кусочка БД будет самым идеологически выдержанным, по вашему мнению ?
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

Все зависит конечно от требуемых запросов в большой степени, но как пример:

Таблица Owner содержащая Id и возможно общие между пользователями и группами свойства.
Таблицы User и Group которые ссылаются один-к-одному на Owner по Id.
Таблица Process имеющая атрибут OwnerId
Аватара пользователя
aissp
Маньяк
Сообщения: 2710
Зарегистрирован: 07 ноя 2005, 09:51

Сообщение aissp »

Не являяст спецлм в бд рискну предположить: Редуцировать задачу к задаче, зарплата менеджер работник :) то есть объеденить группы и пользователей в одной таблице
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Сообщение Дима »

Я так и знал, что в каморке сидят идеологически выдержанные дизайнеры БД :) С точки зрения идеологии грамотно будет создать суперкласс "Владелец процесса", от которого некоторые свойства будут наследовать как юзеры, так и группы. Реализация зависит от конкретной БД; в частности, какие-то об'екты можно хранить во VIEW.
Как часто вы видели идеологически выдержанные базы данных ? :) (рассматриваю таблицу процессов, в которой лежит поле "тип владельца" и "id", которое ссылается либо на юзера, либо на группу в зависимости от значения поля "тип владельца")...
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

Я идеологически невыдержан. В лоб - я создам четыре таблицы - юзеры, группы, процессы и их взаимотношения между собой. Ежели в одной четвертой таблице взаимоотношения между тремя сущностями не представляются - то мона наплодить больше таблиц. Главное в логике не запутаться.

Ежели это не нравится - придется заняться сисемным анализом и строить там иерарихии - от юзеров к группам ну и прочая хрень.

А вообще не важно что там выдержано а что нет. Важно - как ты могешь оппонентов которые грят что твой дизайн - фуфло отфутболивать.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

это делается элементарно....

создается убер таблица... от нее растут юзеры и группы. релейшеншипы между ИД из убер таблице в третьей таблице.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение 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.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

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.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

Marmot писал(а):А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
управление через группы логичнее, абсолютно согласен, анлесс есть какие либо интересные требования почему так не может ьыть сделано.
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение StS »

папа Карло писал(а): that's a bad design.
Why?
Аватара пользователя
Дима
Маньяк
Сообщения: 1455
Зарегистрирован: 15 авг 2006, 10:21
Откуда: Минск->Vancouver->Victoria

Сообщение Дима »

папа Карло писал(а):
Marmot писал(а):А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
управление через группы логичнее, абсолютно согласен, анлесс есть какие либо интересные требования почему так не может ьыть сделано.
Ууу, докопались таки :) Да, есть причины, по которым юзер не может быть заменен на группу, состоящую из одного юзера.
Аватара пользователя
aldep
Маньяк
Сообщения: 1593
Зарегистрирован: 18 фев 2003, 08:06
Откуда: Toronto
Контактная информация:

Сообщение aldep »

StS писал(а):
папа Карло писал(а): that's a bad design.
Why?
Потому что тогда одним запросом не нельзя соединить таблицы процесса и владельца.
папа Карло писал(а): это делается элементарно....
создается убер таблица
А я что предложил?[/quote]
StS
Завсегдатай
Сообщения: 301
Зарегистрирован: 04 май 2005, 11:33

Сообщение 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
Vovchik
Маньяк
Сообщения: 2841
Зарегистрирован: 20 фев 2003, 09:15
Откуда: Vancouver

Сообщение Vovchik »

aldep писал(а):Все зависит конечно от требуемых запросов в большой степени,
Хе-хе. Ежели б знать какие запросы требуются в момент проектирования... Даже ежели все знают через год после ввода так сказать в эксплуатацию вдруг требуется 10 совершенно новых запросов. Вообще канонически модель данных проектируют как отражение бизнес процессов а не чтоб запросы проще писать. Производительность запросов могет правда да страдать зато на апдейт должно все путем быть и гораздо лучше когда какие нить запросы не очень эффективны чем вся модель данных не отражает бизнес процесс и тыда все, боржом пить будети поздно.

Впрочем, амбары данных проектируют как раз наоборот - чтоб запросы быстрее были.
Ответить