MySQL создает структурные отношения между таблицами

#mysql #database-design #relational-database

#mysql #проектирование базы данных #реляционная база данных

Вопрос:

У меня есть 2 таблицы, одна из которых содержит элементы и их свойства, которые являются целыми числами:

таблица элементов:

 item_id, property_a, property_b, property_c
  

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

таблица допустимых отклонений:

 property_a, property_b, property_c
  

Это работает, но между 2 таблицами нет формальной связи, следовательно, нет способа гарантировать, что они синхронизированы, когда таблица элементов каким-либо образом модифицируется (кроме обработки вручную или на уровне приложения).

Итак, мой вопрос — какова наилучшая практика в этой ситуации? Может ли и должна ли какая-то связь между структурой этих 2 таблиц быть установлена на уровне базы данных, или это хорошо, как есть?

Одна из моих мыслей заключалась в том, что, поскольку deviations — это таблица с одной строкой, просто поместить ее в таблицу items, присвоив ей конкретный фиктивный элемент, но проблемы, которые я вижу в этом:

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

Ответ №1:

Я думаю, вам нужно немного нормализовать здесь.

Вы могли бы использовать следующий подход:

таблица элементов

 id  item
1   item1
  

таблица item_property

 id  item_id, property_id
1     1         1
2     1         2
3     1         3
  

таблица допустимых отклонений

 property_id, property_type
1               a
2               b
3               c
  

Это позволит вам установить ограничения FK для таблицы item_property, ссылающейся как на таблицу допустимых отклонений, так и на саму таблицу элементов. Он также должен допускать элементы, которые не имеют всех свойств (без нулевых данных), а также должен позволять добавлять новые свойства, если появятся какие-либо новые (например, свойство d).

Надеюсь, это поможет!

PS Когда вы говорите «Одна из моих мыслей заключалась в том, что отклонения — это таблица с одним столбцом», вы имеете в виду «Одна из моих мыслей заключалась в том, что отклонения — это таблица с одной строкой«?

Комментарии:

1. Спасибо, да, я имел в виду строку, вопрос отредактирован. Я не совсем уверен, что полностью понял ваш ответ — таблица отклонений будет содержать определения свойств в виде строк, это предложение? Если это так, недостатком этого будет необходимость в другом наборе отклонений, для чего потребуется новый столбец, что может быть не лучшей практикой для организации данных.

2. ДА. Идея состоит в том, чтобы хранить определения свойств в виде строк. Я думаю, что если существует другой набор допустимых отклонений (скажем, d, e и f), это будет означать, что в таблицу отклонений будут вставлены 3 новые строки, а таблица item_property будет заполнена элементами, к которым применим новый набор отклонений. Это не должно требовать добавления нового столбца. Надеюсь, это имеет смысл!