|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Суть вопроса такая: Есть четыре таблицы: пользователи, сервисы, магазины и бренды. Пользователь может не иметь никаких отношений к сервисам, магазинам и брендам (и таких будет большинство). Пользователь, с другой стороны, может иметь отношение только либо к сервису, либо к магазину, либо к бренду (но не к сервису и магазину, сервису и бренду, бренду и магазину и к трем сущностям сразу одновременно). Пользователь может быть привязан только к ОДНОМУ сервису/магазину/бренду. Таким образом вырисовываются связи "один ко многим". Теперь о реализации... 1. Можно сделать в таблице пользователей три столбца: service_id, store_id и brand_id - это будут внешние ключи. Если пользователь привязан к чему либо, то будет заполнен только один из этих столбцов, два других будут пустовать. Но большинство пользователей вообще не будут иметь привязок и эти три столбца у них будут пустовать. 2. В таблице пользователей не определяем столбцы с внешними ключами, а делаем три связующих таблицы: пользователь-сервис, пользователь-магазин и пользователь-бренд с внешними ключами, и по необходимости их заполняем. Вопрос: какой вариант более правильный? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 10:10 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
С точки зрения работы подсистемы контроля целостности более реален первый вариант. Правда, контроль того, что не более одного из полей содержит значение, придётся реализовывать триггерной логикой, но это мне кажется наименьшим из зол... Второй вариант компактнее, но опять же он требует триггерной логики, причём более сложной (и соответственно более потенциально-сбойной). Это при условии, что не рассматривается объединение сущностей "сервисы", "магазины" и "бренды" в одну сущность "нечто, к чему может иметь отношение пользователь". В этом варианте у пользователя в таблице будет единственная внешняя ссылка, возможно, пустая. Целесообразность (и вообще возможность) такого объединения определяется предметной областью и процессами, но всё это в вопросе не описано. Ну и довеском - при такой непростой схеме разумно полностью выносить логику на сервер (т.е. отказываться при изменении данных от запросов в пользу хранимых процедур, с соответствующим ограничением прав доступа к данным). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 11:14 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Да, наверное буду использовать первый вариант - он проще, не смотря на избыток полей... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 13:14 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Алексей ТрофимовСуть вопроса такая: Есть четыре таблицы: пользователи, сервисы, магазины и бренды. Вопрос: какой вариант более правильный? :) Никакой. Есть вариант добавить две таблицы, связанные с пользователями, сервисами, магазинами и брендами - "история заказов пользователей" и "история продаж пользователям" (потому что не каждый заказ в магазине заканчивается продажей). И вот там делать many-to-many. Включая поля с датами. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 13:19 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Алексей Трофимов, "Можно сделать в таблице пользователей три столбца: service_id, store_id и brand_id - это будут внешние ключи. Если пользователь привязан к чему либо" - то есть Вы хотите сделать таблицу "предпочтения пользователей" с любимыми брендами, сервисами или магазинами, но хотите это впихнуть в существующие таблицы? Это путь в пропасть. Потому что у пользователя может появиться любимый способ оплаты (наличные курьеру, банковская карта, оплата paypal и так далее) и таблица payments. Делайте 3 (!) раздельные таблицы - любимые магазины shops_for_users, любимые сервисы services_for_users и так далее. Тогда эта схема будет расширяться без вырывания остатков волос. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 13:22 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Не, тут не предпочтения. Это функционал для сервисного центра. Если пользователь просто клиент сервиса, то привязки не нужны. Также пользователь может быть сотрудником сервиса, представителем магазина или представителем производителя товара, что-то одно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 16:36 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Алексей ТрофимовНе, тут не предпочтения. Это функционал для сервисного центра. Если пользователь просто клиент сервиса, то привязки не нужны. Также пользователь может быть сотрудником сервиса, представителем магазина или представителем производителя товара, что-то одно. Ну тогда более правильный вариант первый, никаких null полей, дефолтный ключ int или bigint как 0, нумерация сервисов и так далее от 1, обязательно foreign key на три столбца в таблице пользователей. Ну и трижды подумать над тем, что будете вписывать в триггеры, если они понадобятся. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 17:37 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Алексей Трофимов, А точно Сервис, Магазин и Производитель товара должны быть тремя отдельными сущностями? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 23:38 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
miksoft, Есть мысль вместо трех таблиц сделать одну, смешанную, с дополнительным столбцом, где будет обозначено, что из себя представляет запись (сервис, магазин или бренд) и в таблице пользователей делать только один внешний ключ (либо заполнен, либо нет) и, возможно, это будет правильней, но пока не понятно, как будет развиваться дальнейший функционал... И атрибуты сервисов, магазинов и брендов сильно разнятся... Возможно в дальнейшем объединю, но пока решил оставить как есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2018, 11:33 |
|
Связи "один ко многим" - как сделать правильней?
|
|||
---|---|---|---|
#18+
Алексей ТрофимовЕсть мысль вместо трех таблиц сделать одну, смешанную, с дополнительным столбцом, где будет обозначено, что из себя представляет запись (сервис, магазин или бренд) и в таблице пользователей делать только один внешний ключ (либо заполнен, либо нет) Алексей Трофимов , я об этом уже говорил. 21774593 Алексей Трофимовпока не понятно, как будет развиваться дальнейший функционалЕсли функционал не окончателен, то объединённая таблица должна быть разреженной. А поскольку скорее всего каждый тип сущности имеет уникальный атрибут (или несколько), то поле типа не требуется. Само собой, разреженность и её согласованность должны поддерживаться соответствующими мерами - про серверную логику я тоже уже говорил. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2018, 11:39 |
|
|
start [/forum/topic.php?fid=47&fpage=41&tid=1829388]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 403ms |
total: | 545ms |
0 / 0 |