2016-08-02 4 views
1

Я создаю базу данных (упрощенную здесь) для хранения деталей. Каждая часть имеет свой собственный уникальный PartID. Мы можем хранить детали в различных контейнерах:Связывание данных с несколькими объектами в базе данных

  • многоразовые мешки
  • Коробки
  • Паллеты

Очень важно, что мы имеем конкретную различную информацию для каждого контейнера:

  • Сумки: ID, MaterialType, Volume, HandleType
  • коробки: ID, высота, ширина, длина
  • паллеты: ID, DateCreated, NumberOfTimesUsed, цвет

Мой вопрос: Каков наилучший способ связать части к эти несколько контейнеров?

На мой взгляд, самым простым способом является создание столбцов ContainerType и ContainerID в таблице Part. Я не решаюсь это сделать, потому что вы существенно нарушаете ссылочную целостность, имея столбец с неучтенным внешним ключом для нескольких таблиц, потому что это незаконно.

Мы можем изготовить большой контейнерный стол со всеми возможными свойствами контейнера, но это тоже очень громоздко.

Любая помощь или руководство будет принята с благодарностью!

+0

Лично я бы создал таблицу 'container' с идентификаторами столбцов, ContainerType, MaterialType, Volume, HandleType, Height, Width, Length, DateCreated, NumberOfTimesUsed,' и 'Color'. У вас будет тонна значений NULL, но это упростит объединение, и вы можете избежать повторения большого количества данных в таблице деталей. Вы просто присоединитесь к идентификационному номеру. –

ответ

1

Это вопрос, который не имеет большого ответа в MySQL. Существует несколько подходов, каждый из которых имеет свои плюсы и минусы.

Вариант № 1 - Таблица полна значение NULL

Как указывается в комментариях, containers таблицы, которая будет иметь все столбцы, многие из них NULL, потому что они не будут иметь значения для 2 3 контейнера типы. Очень удобно использовать такую ​​таблицу в SELECT и JOIN, но в этом случае БД не может помочь вам проверить ваши данные. Вы можете легко вставить мешки с длиной или коробками, у которых их нет, и БД не может обеспечить его выполнение.

Вариант № 2 - Переместить задачу к соединительной таблице

При таком подходе вы двигаетесь проблемой из таблиц, в которых хранятся контейнеры для таблиц, хранящего расположение частей.

Есть 3 отдельные контейнеры таблицы:

  • сумки
  • коробки
  • поддоны

И один стол для подключения частей к контейнерам:

  • parts_to_containers

с колоннами:

  • part_id
  • container_type
  • container_id

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

Вы все еще можете написать запрос с 3 LEFT JOIN s, который поможет вам получить информацию о контейнере для каждой части.

Еще одна вещь

Если вы планируете иметь много более типов контейнеров, ни один из вышеперечисленных не будет легко масштабировать. При добавлении все больше и больше типов контейнеров, вы можете совершенно другой подход, при котором все общих контейнерных полей находятся в одном главной containers таблицы, а весь остальные контейнера атрибуты находятся в container_attributes таблицы с container_id, attribute_name и attribute_value. Одним из атрибутов будет тип контейнера, другие будут цветом, шириной, объемом и т. Д.

Это очень гибкая модель для объектов с множеством различных аттратов, которые меняются со временем.

+0

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

0

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

Создайте таблицу под названием containers с номером первичного ключа container. id и другие столбцы, такие как container. name, container. createdOn, container. lastOpenedOn. Первичный ключ container. id из таблицы container добавляется в таблицу деталей в виде столбца внешнего ключа под названием parts. container_id.

+0

Yikes! возможно, мне следовало бы уточнить, но это отношения от 1 до многих. Многие части могут жить в одном контейнере, и у меня есть только одна таблица деталей. – user1904766

Смежные вопросы