База данных сложных отношений - PullRequest
0 голосов
/ 09 января 2019

Я пытался решить проблему для этой системы, но я не уверен, как этого добиться

позвольте мне объяснить, что я хочу:

Существует 1 таблица конфигурации, которая может содержать несколько субконфигураций,

1 субконфигурация может содержать несколько субконфигураций,

1 суб-субконфигурация, которая может содержать несколько суб-суб-конфигураций

и 1 Sub-Sub-Sub-Configuration могут содержать продукты:

извините, если это сбивает с толку, но здесь проблема.

Подконфигурация может также содержать только продукты. то же самое для субконфигураций.

и сложная часть того, что клиенты должны иметь подключения ко всем этим субконфигурациям и продуктам.


так что у меня есть что-то вроде этого с примером:

A - это Конфигурация и только конфигурация

A1, B1 и C1 - это субконфигурации конфигурации A

A2, B2 и C2 - это субконфигурация субконфигурации A1

A3, B3 и C3 являются суб-суб-суб-конфигурацией суб-суб-конфигурации A2

и у нас есть сыр, чипсы и рыба как продукты Sub-Sub-Sub-Configuration A3.

но в С2 тоже может быть корова.

После этого клиент получает истинное утверждение о сыре и корове, что означает, что он выбрал эти продукты.

если любой гений может помочь мне с этой проблемой, пожалуйста, дайте мне знать;)

PS: я добавил PHP, потому что это будет сделано в коде PHP, подключенном к базе данных.

1 Ответ

0 голосов
/ 09 января 2019

Как упоминает Eakethet в комментарии, хорошим решением является создание единой таблицы для всех конфигураций, которая затем ссылается на себя, используя столбец parent_id.

Я бы сделал что-то подобное.

+-----------+-----------------+-----------+
| config_id |      name       | parent_id |
+-----------+-----------------+-----------+
|         1 | Main            | null / 0  |
|         2 | Animal products | 1         |
|         3 | Cow             | 2         |
|         4 | Chicken         | 2         |
|         5 | Milk            | 3         |
|         6 | Cheese          | 3         |
|         7 | Egg             | 4         |
+-----------+-----------------+-----------+

Это устанавливает четкую и прямую связь между каждой конфигурацией. Нужно знать, откуда взялись яйца? Посмотри на родителя. Нужно знать, какие продукты вы получаете от коров? Возьмите config_id для Cow и найдите все элементы, в которых он указан как родитель.

EDIT:

Объяснение этой структуры более подробно.

У вас есть основная конфигурация (вы назвали ее A в своем вопросе). Main имеет уникальный идентификатор, который его идентифицирует (config_id = 1). Ниже Main у нас есть первая субконфигурация, я назвал ее «Продукты животного происхождения» в своем ответе. В своем столбце parent_id он ссылается на config_id "Main". По сути, он говорит, что «Main» является его родительской конфигурацией. Это подконфигурация "Main".

Ниже "Продукты животного происхождения" находится следующий уровень субконфигураций. Я назвал мои "Корова" и "Цыпленок". Они оба ссылаются на config_id «Продукты животного происхождения» в соответствующих столбцах parent_id. Это субконфигурации «Продукты животного происхождения».

Внизу находятся продукты или суб-суб-субконфигурации. «Молоко» и «Сыр» оба ссылаются на «Корову» как своего родителя (parent_id 3), в то время как «Яйцо» ссылается на «Курицу» (parent_id 4).

Это может продолжаться вниз столько уровней, сколько вам нужно. Если вы обнаружите, что вам нужны определенные марки сыров (чеддер или гауда), вы можете сделать так, чтобы они называли «сыр» своим родителем. Если вы решите, что вам нужна конфигурация на уровне между «продуктами животного происхождения» и «курицей», вы можете добавить конфигурацию с именем «птицы». Установите для parent_id ссылку на config_id для «продуктов животного происхождения» (1), а затем установите parent_id для «Цыпленка» для ссылки на config_id для «Птицы».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...