#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 будет заполнена элементами, к которым применим новый набор отклонений. Это не должно требовать добавления нового столбца. Надеюсь, это имеет смысл!