Задачка на проектирование БД с интересным ответом
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
- george
- Графоман
- Сообщения: 14127
- Зарегистрирован: 20 июл 2003, 12:48
- Откуда: M2R
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Тыда могешь обойтись тремя таблицами - юзер, группа, процесс. А ежели у всех трех сущностей отношения - многие ко многим? Тыда пересечения надо хранить в четвертой таблице.george писал(а):Я бы сделал просто, если только смотреть с точки зрения "красоты". Есть класс "процесс", у него два релейшеншипа один-ко-многим. Process -> user, и
Process -> user group. Баста.
С практической точки зрения триста раз подумать ...
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
-
- Пользователь
- Сообщения: 110
- Зарегистрирован: 20 фев 2003, 07:17
- Откуда: оттуда
Товарищи, а вам не кажется, что вы валите в кучу логический и физический дизайн? Сначала обсуждаете "объекты" и "суперклассы", и тут же начинаете по ним запросы строить. Это все таки разные звери, нет?
Можно замечательно идеологически выдержанную картинку нарисовать с суперклассами и наследованием, а реализовать все это так, чтобы запросы было удобно писать и чтобы бегало быстро.
Можно замечательно идеологически выдержанную картинку нарисовать с суперклассами и наследованием, а реализовать все это так, чтобы запросы было удобно писать и чтобы бегало быстро.
-
- Пользователь
- Сообщения: 93
- Зарегистрирован: 14 июл 2006, 16:15
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
не местный писал(а):Товарищи, а вам не кажется, что вы валите в кучу логический и физический дизайн? Сначала обсуждаете "объекты" и "суперклассы", и тут же начинаете по ним запросы строить. Это все таки разные звери, нет?
Можно замечательно идеологически выдержанную картинку нарисовать с суперклассами и наследованием, а реализовать все это так, чтобы запросы было удобно писать и чтобы бегало быстро.


- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
-
- Пользователь
- Сообщения: 141
- Зарегистрирован: 21 мар 2005, 20:08
- Откуда: St. Petersburg->Vancouver
а хотя бы потому: если в системе 10 групп на 10,000 пользователей, то поддерживание всего етого барахла, особенно если список процессов достается раз в неделю вильется в копеечку.папа Карло писал(а):управление через группы логичнее, абсолютно согласен, анлесс есть какие либо интересные требования почему так не может ьыть сделано.Marmot писал(а):А я бы сделал так что бы владеть процессом могли только группы.
Не вижу ничего неправильного в том что в группе может быть один юзер.
Зато всё будет логично и прямолинейно...
говоря о планах, хорошо бы знать соотношение сколько групп сколько юзеров... как часто группа может владеть процесс-ом.... а так, в общем вариантов довольно много, в общем то предложение сделать process(#process_id, user_id,group_id) + соот. constrains/indexes может вполне сработать, по крайней мере с точки зрения наименьшего копирования данных, соот. если система большей частью пишет, то может быть оптимальным.
-
- Пользователь
- Сообщения: 93
- Зарегистрирован: 14 июл 2006, 16:15
Кое-что из неправильного работает быстрее и надежнее правильного.папа Карло писал(а):это совсем не правильно. почему рассказать?

Вы пробовали соблюдать все 5 правил нормализации? Или 12 законов Кода? Да они в Оракле нарушены априори

Речь шла о 12000 групп и 4000000 пользователей. Да в общем-то до сих пор в SAAB бежит, правда поскромнее версия.
Хотя под конкретно эту задачу возможно и не лучший вариант. В моем случае стояла задача разветвленного контроля доступа к данным для групп и юзеров. И переход на сквозную нумерацию решил многие проблемы.
- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
а можно услышать как в оракле (субд) нарушены правила нормализации? то решение что у вас там сделано нарушает первую нормальную форму... вопрос если вам не надо первую нормальную форму, то зачем использовать реляционный двигатель?Bege-Motek писал(а):Кое-что из неправильного работает быстрее и надежнее правильного.папа Карло писал(а):это совсем не правильно. почему рассказать?![]()
Вы пробовали соблюдать все 5 правил нормализации? Или 12 законов Кода? Да они в Оракле нарушены априори
Речь шла о 12000 групп и 4000000 пользователей. Да в общем-то до сих пор в SAAB бежит, правда поскромнее версия.
Хотя под конкретно эту задачу возможно и не лучший вариант. В моем случае стояла задача разветвленного контроля доступа к данным для групп и юзеров. И переход на сквозную нумерацию решил многие проблемы.
ну а сквозную нумерацию можно було сделать и без отрицательных чисел... 4 млн записей совсем не показатель

-
- Пользователь
- Сообщения: 93
- Зарегистрирован: 14 июл 2006, 16:15
Информация в Оракле не всегда хранится в ячейках.папа Карло писал(а):а можно услышать как в оракле (субд) нарушены правила нормализации?
Оракл не всегда может обеспечить доступ к сохраненным данным через простой запрос
Если поле содержит null то не все операции поддерживаются
Я думаю не только Оракл не соблюдает. Что не мешает ему быть достаточно реляционным.
ну не совсем. Юзер и группа - объекты одного дерева. Просто юзер имеет свое расширение а группа свое.папа Карло писал(а): то решение что у вас там сделано нарушает первую нормальную форму... вопрос если вам не надо первую нормальную форму, то зачем использовать реляционный двигатель?
Тут Вы правы. Хотя отработка дерева из 4000000 объектов против дерева из 200 млн документов была вполне интересной задачей. Особенно учитывая 1 гб памяти и 2 процессора Spark 400папа Карло писал(а): ну а сквозную нумерацию можно було сделать и без отрицательных чисел... 4 млн записей совсем не показатель
Я девушка скромная, миллионами записей мне с Вами не меряться

- папа Карло
- Шарманщик
- Сообщения: 8565
- Зарегистрирован: 17 фев 2003, 15:04
- Откуда: НН -> BC -> WA -> UT -> CA
то, что не все операции поддерживаются... так для релационности все что надо это стандартные операции по работе со множествами... они в оракле точно есть. и null тут будет не при чем.Bege-Motek писал(а):Информация в Оракле не всегда хранится в ячейках.папа Карло писал(а):а можно услышать как в оракле (субд) нарушены правила нормализации?
Оракл не всегда может обеспечить доступ к сохраненным данным через простой запрос
Если поле содержит null то не все операции поддерживаются
Я думаю не только Оракл не соблюдает. Что не мешает ему быть достаточно реляционным.
ну не совсем. Юзер и группа - объекты одного дерева. Просто юзер имеет свое расширение а группа свое.папа Карло писал(а): то решение что у вас там сделано нарушает первую нормальную форму... вопрос если вам не надо первую нормальную форму, то зачем использовать реляционный двигатель?
Тут Вы правы. Хотя отработка дерева из 4000000 объектов против дерева из 200 млн документов была вполне интересной задачей. Особенно учитывая 1 гб памяти и 2 процессора Spark 400папа Карло писал(а): ну а сквозную нумерацию можно було сделать и без отрицательных чисел... 4 млн записей совсем не показатель
Я девушка скромная, миллионами записей мне с Вами не мерятьсяЭто к мужу, у него там петабайты



-
- Завсегдатай
- Сообщения: 301
- Зарегистрирован: 04 май 2005, 11:33
папа Карло писал(а):это делается элементарно....
создается убер таблица... от нее растут юзеры и группы. релейшеншипы между ИД из убер таблице в третьей таблице.
папа Карло писал(а):запросы попиши вокруг этого дизайна и квери план посмотри.. все встанет на свои места.StS писал(а):Why?папа Карло писал(а): that's a bad design.
То есть, запросы к пяти таблицам (процесс, убер, узер, группа, "третья") будут проще чем к трем?
-
- Маньяк
- Сообщения: 2841
- Зарегистрирован: 20 фев 2003, 09:15
- Откуда: Vancouver
Вообще при проектировании моделей данных не используются такие вещи как классы, наследования и прочее. Там есть сущности, атрибуты, ограничения и отношения. Сразу видно два подхода - программистский и аналитический. Программистский - это сверху вниз. Сначала мы сделаем дезайн софтины, там классы все такое - а потом под уже готовый дизайн софта будем думать как и где хранить данные. Результат обычно бывает плачевный бо данные не соответствуют действительности. Поскольку внешне все вроде клево - проблемы вылезают через некоторое время когда вдруг оказывается что данных которых надо - нету, а которых не надо - до фига.не местный писал(а):Товарищи, а вам не кажется, что вы валите в кучу логический и физический дизайн? Сначала обсуждаете "объекты" и "суперклассы", и тут же начинаете по ним запросы строить. Это все таки разные звери, нет?
Аналитический. Снизу вверх. Сначала делаем модель данных. Которая отражает бизнес модель. Сущности, атрибуты, отношения. Поток данных. Потом логическую модель проецируем в физическую. Потом строим над схемой данных приложение. Результат - лучше чем в первом случае но да писание запросов может вылиться в то еще упражнение.
А посему как всегда - приходится искать компромисс. Так сказать, спиралевидный процесс. Построили логическую модель. Построили физическую. Подумали над запросами и прочая. Решили что где важнее. Переделали. Подумали. И так далее... Пока не вылезет некий компромисс.
Однако лично я сторонник аналитического дезайна. Снизу вверх. Бо бизнес процесс и модель данных - это значительно более стабильные вещи чем желание юзверей придумать еще какие нить отчеты. Опять же переписать че нить там в софте - это одно. А переделвать модель данных - это все, туши свет.
- Дима
- Маньяк
- Сообщения: 1455
- Зарегистрирован: 15 авг 2006, 10:21
- Откуда: Минск->Vancouver->Victoria
Вообще, конечно, мне было интересно, как народ укладывает иерархическую структуру классов ("сущностей" в терминах проектирования, если уж быть до конца точным) в реляционную базу данных. Мнения, в общем, разделились
Как мне кажется, в любом предложенном подходе можно найти рациональные зерна, но
На компромиссы с принципами нормализации стоит ходить только в случае значительного выигрыша во времени на часто выполняемых запросах. Хранение промежуточных итогов - один из таких компромиссов в data warehouse, например.
Мне сложно себе представить запросы, в которых можно получить значительный выигрыш во времени, используя разные диапазоны ID для юзеров и групп вместо добавления одной связки. Впрочем, может быть это ограничение моей фантазии..

Как мне кажется, в любом предложенном подходе можно найти рациональные зерна, но

Мне сложно себе представить запросы, в которых можно получить значительный выигрыш во времени, используя разные диапазоны ID для юзеров и групп вместо добавления одной связки. Впрочем, может быть это ограничение моей фантазии..