|
|
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
Какой раз уже задумываюсь об этом, но так и не могу понять как правильно. А преподаватель на контакт не идет. Прошу не придираться к бессмысленности примера. Это всего лишь пример. И.. я только учусь. И.. извиняюсь за много букв. Допустим есть универмаги, магазины и киоски (торговые точки). У универмагов есть секции, поделённые на залы. Магазины поделены только на залы. Допустим есть ещё уборщицы, которые привязаны к любой торговой точке одной. На одну точку может быть несколько уборщиц. И допустим ещё есть продавцы. Они привязаны либо к залам универмага, либо к залам магазина, либо к киоскам. Может быть по несколько. Вопросы: 1. Стоит ли объединять все торговые точки в одну сущность? Да? А если данные будут разниться, то наследование таблиц? 2. Допустим атрибуты залов никогда ничем не отличаются. Значит объединяем их в одну сущность? Один из атрибутов будет тип зала: "Зал универмага" или "Зал магазина". Что делать с внешним ключом. Нужно делать одно поле, которые будет играть двоякую роль в зависимости от типа, или нужно сделать два отдельных поля, одно из которых всегда должно иметь значение NULL? Как лучше? 3. С уборщицами вроде все очевидно, мы ведь специально сделали сущность торговая точка с разными подтипами. 4. С продавцами та же история, что и с залами. Отдельные сущности вроде как смысла делать нет, делаем разные подтипы. Сколько внешних ключей делаем, 1 неоднозначный или 2, один из которых всегда NULL. 5. Бывают ситуации, когда без наследования не обойтись. Есть много разновидностей предков от объекта (15), их экземпляров много (тысячи), у всех разные атрибуты. Если вот так делать таблицы со связью 1:1, то при обработке таких данных, как я понимаю, будет тратится ужас много ресурсов во-первых. Во-вторых сложность алгоритмом возрастает во многие разы. К примеру я работал с СДО Moodle - там повсюду ООП и типа мощная архитектура. В итоге минимальные системные требования сервера: ОЗУ 256мб, +1гб на каждые 50 пользователей одновременно работающих. Всё работает ужас медленно. Так какой же тогда выход? Как сделать быстро, удобно, понятно и правильно? Буду очень благодарен, если кто-нибудь даст ссылок где можно почитать что-то толковое о наследовании в БД. Желательно на русском. Собрался сделать кое-что нужное и значимое. Понимаю, что прошу многого, но надеюсь на ваш альтруизм. А я потом поделюсь своим с другими людьми в хорошо понимаемых мной областях :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 09:32 |
|
||
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
Разберись, что ты моделируешь. Точки с торговыми площадями, оборудованием и персоналом, это физический мир со сложной организацеий. Ты пытаешься напялить на него свою классификацию, которая служит какой то определённой цели. (Почему бы не классифицировать объекты по цвету или по топологии подключения к электросети?) Если в твоей классификации требуется строгая типизация объектов учёта, то никуда от неё не денешься. Смотрю, речь зашла о сотрудниках. Подозреваю, что классификатор тебе нужен для штатного расписания. Так зачем тебе в штатном расписании строго типизированная иерархия точек и залов. А что если твою систему захотят установить не в розничной торговле, а на оптовом сладе или на заводе? Напиши просто: ДолжностьОтделКатегорияМенеджерЗал ПО в магазине "Зацепись ты".СтаршойКонсультантЗал ПО в магазине "Зацепись ты".ЭкспертКонсультантЗал ПО в магазине "Зацепись ты".AnykeyМенеджерЗал Сетевого оборудования в магазине "Зацепись ты".МладшийУборщицаЭтаж 1 магазин "Зацепись ты".УборщицаЭтаж 2 магазин "Зацепись ты".УборщицаТуалеты магазин "Зацепись ты".ПродавецТочка "Загугли" Отделы можно как то структурировать, обычно по административному подчинению. Но как видим, административная структура может не совпадать с классификацией торговых площадей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 10:29 |
|
||
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
Спасибо за замечание, но на самом деле под фразой "прошу не придираться к бессмысленности примера" я подразумевал то, что мой пример не имеет никакого практического применения. Это лишь плод фантазии, чтобы свести все к проблемной ситуации. Чтобы я смог разобраться как правильно указывать внешние ключи, если возникнет что-то подобное. Зал ссылается либо на секцию универмага, либо на магазин (торговую точку с типом магазин). Делать один внешний ключ "id чего-то, к чему относится зал" или два: "id секции универмага" и "id магазина", один из них всегда должен быть NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 13:30 |
|
||
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
> Зал ссылается либо на секцию универмага, либо на магазин Это легко обходится типизацией торговых залов. Вы можете рассматривать киоск как торговый зал, который используется только для размещения витрин без доступа к ним покупателей. Т. е. для розничной точки с обслуживающим персоналом пара (идентификатор точки, идентификатор зала) будет иметь смысл. Приведенный вами пример неудачен: задача может иметь стандартное решение. Однако, вопрос вы задали совершенно правильно. Действительно, есть структуры, где выбор идентификатора необходим. Но также можно придумать структуры, когда один идентификатор необходим, а второй может использоваться, а может и не использоваться. Универсальных рекомендаций по выбору решения нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 18:45 |
|
||
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
cobaЗал ссылается либо на секцию универмага, либо на магазин (торговую точку с типом магазин). Делать один внешний ключ "id чего-то, к чему относится зал" или два: "id секции универмага" и "id магазина", один из них всегда должен быть NULL. а вы не считаете, что зал магазина и зал секции универмага-разные типы залов? если разные, то вполне естественно, что они имеют разные типы предков, точнее они потому и разные типы, что ссылаются на предков разного типа. если напротив, ссылку направить от предка к потомку, (возможно через таблицу сязей, если речь идет о реляционной БД) то однотипные залы можно будет создавать в торговых предприятиях разного типа. всегда остается выбор между строгой типизацией на уровне структур и типов данных, и слабой типизацией с проверками правил целостности на уровне декларативных и процедурных ограничений целостности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2011, 21:47 |
|
||
|
Подтипы объекта с разными внешними ключами
|
|||
|---|---|---|---|
|
#18+
coba, часто делали "вырожденное" наследование когда в какую-то таблицу надо вставлять ссылки на разных потомком одной сущности Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Родитель вырожден фактически в ID - потомки наследуют только его ID - это дает свободу в варьировании атрибутов, освобождает от соединений с предком при выборках, позволяет вставлять ссылку на различные типы потомков в одно поле таблицы Единственный минус - чуть усложняется выборка данных потомка по его ID из родительской таблицы по типу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2011, 14:14 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=54&tid=1541896]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 392ms |

| 0 / 0 |
