powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связи "один ко многим" - как сделать правильней?
11 сообщений из 11, страница 1 из 1
Связи "один ко многим" - как сделать правильней?
    #39753782
Суть вопроса такая:
Есть четыре таблицы: пользователи, сервисы, магазины и бренды.
Пользователь может не иметь никаких отношений к сервисам, магазинам и брендам (и таких будет большинство).
Пользователь, с другой стороны, может иметь отношение только либо к сервису, либо к магазину, либо к бренду (но не к сервису и магазину, сервису и бренду, бренду и магазину и к трем сущностям сразу одновременно).
Пользователь может быть привязан только к ОДНОМУ сервису/магазину/бренду.

Таким образом вырисовываются связи "один ко многим".

Теперь о реализации...
1.
Можно сделать в таблице пользователей три столбца:
service_id, store_id и brand_id - это будут внешние ключи. Если пользователь привязан к чему либо, то будет заполнен только один из этих столбцов, два других будут пустовать.
Но большинство пользователей вообще не будут иметь привязок и эти три столбца у них будут пустовать.

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

Вопрос: какой вариант более правильный? :)
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39753810
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С точки зрения работы подсистемы контроля целостности более реален первый вариант. Правда, контроль того, что не более одного из полей содержит значение, придётся реализовывать триггерной логикой, но это мне кажется наименьшим из зол...

Второй вариант компактнее, но опять же он требует триггерной логики, причём более сложной (и соответственно более потенциально-сбойной).

Это при условии, что не рассматривается объединение сущностей "сервисы", "магазины" и "бренды" в одну сущность "нечто, к чему может иметь отношение пользователь". В этом варианте у пользователя в таблице будет единственная внешняя ссылка, возможно, пустая. Целесообразность (и вообще возможность) такого объединения определяется предметной областью и процессами, но всё это в вопросе не описано.

Ну и довеском - при такой непростой схеме разумно полностью выносить логику на сервер (т.е. отказываться при изменении данных от запросов в пользу хранимых процедур, с соответствующим ограничением прав доступа к данным).
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39753871
Да, наверное буду использовать первый вариант - он проще, не смотря на избыток полей...
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39753878
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ТрофимовСуть вопроса такая:
Есть четыре таблицы: пользователи, сервисы, магазины и бренды.

Вопрос: какой вариант более правильный? :)
Никакой. Есть вариант добавить две таблицы, связанные с пользователями, сервисами, магазинами и брендами - "история заказов пользователей" и "история продаж пользователям" (потому что не каждый заказ в магазине заканчивается продажей). И вот там делать many-to-many. Включая поля с датами.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39753880
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Трофимов,

"Можно сделать в таблице пользователей три столбца: service_id, store_id и brand_id - это будут внешние ключи. Если пользователь привязан к чему либо" - то есть Вы хотите сделать таблицу "предпочтения пользователей" с любимыми брендами, сервисами или магазинами, но хотите это впихнуть в существующие таблицы? Это путь в пропасть. Потому что у пользователя может появиться любимый способ оплаты (наличные курьеру, банковская карта, оплата paypal и так далее) и таблица payments.

Делайте 3 (!) раздельные таблицы - любимые магазины shops_for_users, любимые сервисы services_for_users и так далее. Тогда эта схема будет расширяться без вырывания остатков волос.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754015
Не, тут не предпочтения. Это функционал для сервисного центра.
Если пользователь просто клиент сервиса, то привязки не нужны.
Также пользователь может быть сотрудником сервиса, представителем магазина или представителем производителя товара, что-то одно.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754071
Andy_OLAP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ТрофимовНе, тут не предпочтения. Это функционал для сервисного центра.
Если пользователь просто клиент сервиса, то привязки не нужны.
Также пользователь может быть сотрудником сервиса, представителем магазина или представителем производителя товара, что-то одно.
Ну тогда более правильный вариант первый, никаких null полей, дефолтный ключ int или bigint как 0, нумерация сервисов и так далее от 1, обязательно foreign key на три столбца в таблице пользователей. Ну и трижды подумать над тем, что будете вписывать в триггеры, если они понадобятся.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754253
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Трофимов,

А точно Сервис, Магазин и Производитель товара должны быть тремя отдельными сущностями?
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754430
miksoft,

Есть мысль вместо трех таблиц сделать одну, смешанную, с дополнительным столбцом, где будет обозначено, что из себя представляет запись (сервис, магазин или бренд) и в таблице пользователей делать только один внешний ключ (либо заполнен, либо нет) и, возможно, это будет правильней, но пока не понятно, как будет развиваться дальнейший функционал... И атрибуты сервисов, магазинов и брендов сильно разнятся...
Возможно в дальнейшем объединю, но пока решил оставить как есть.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754438
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ТрофимовЕсть мысль вместо трех таблиц сделать одну, смешанную, с дополнительным столбцом, где будет обозначено, что из себя представляет запись (сервис, магазин или бренд) и в таблице пользователей делать только один внешний ключ (либо заполнен, либо нет) Алексей Трофимов , я об этом уже говорил. 21774593

Алексей Трофимовпока не понятно, как будет развиваться дальнейший функционалЕсли функционал не окончателен, то объединённая таблица должна быть разреженной. А поскольку скорее всего каждый тип сущности имеет уникальный атрибут (или несколько), то поле типа не требуется. Само собой, разреженность и её согласованность должны поддерживаться соответствующими мерами - про серверную логику я тоже уже говорил.
...
Рейтинг: 0 / 0
Связи "один ко многим" - как сделать правильней?
    #39754612
авторя об этом уже говорил. 21774593

Да, это вы навели меня на эту мысль, спасибо! :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Связи "один ко многим" - как сделать правильней?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]