Антипаттерн?
В общем случае вторая таблица anti-pattern в контексте проектирования базы данных. И, более того, оно имеет определенное имя: Entity-Attribute-Value (EAV). Есть некоторые случаи, когда использование этого дизайна оправдано, но это редкие случаи - и даже там его можно избежать.
Почему EAV плохо
целостности данных Поддержка
Несмотря на то, что такая структура, как представляется, более «гибким» или «продвинутый», эта конструкция имеет слабость.
- Невозможно сделать обязательные атрибуты. Вы не можете сделать некоторый атрибут обязательным, поскольку атрибут теперь хранится как строка - и единственный признак, который этот атрибут не задан, - это то, что соответствующая строка отсутствует в таблице. SQL не позволит построить такое ограничение изначально - таким образом, вы должны проверить, что в приложении - и, да, запрос в вашей таблице каждый раз
- Смешение типов данных. Вы не сможете использовать стандартные типы данных SQL. Поскольку столбец значений должен быть «супертипом» для всех сохраненных значений. Это означает, что в целом вы должны хранить все данные как необработанные строки. Затем вы увидите, как тяжело работать с датами, как с строками, каждый раз набирать типы данных, проверять целостность данных, e t.c.
- Невозможно обеспечить ссылочную небрежность. В обычной ситуации вы можете использовать внешний ключ для ограничения своих значений теми, которые определены в родительской таблице. Но не в этом случае - это потому, что ссылочная целостность применяется к каждой строке в таблице, но не для значений строк. Итак - вы потеряете это преимущество - и это один из основных в отношении DB
- Невозможно установить атрибуты атрибутов. Это означает, что вы не можете правильно ограничить имя атрибута на уровне БД. Например, вы напишете
"customer_name"
как имя атрибута в первом случае - и другой разработчик забудет это и использует "name_of_customer"
. И .. все в порядке, DB это пройдет, и вы закончите с часами, потраченными на отладку этого дела.
реконструкция Ряд
Кроме того, реконструкция строки будет ужасно в общем случае. Если у вас есть, например, 5 атрибутов - это будет 5 самозанятых JOIN
-s. Слишком плохо для такого простого - на первый взгляд - случай. Поэтому я не хочу даже представить, как вы будете поддерживать 20 атрибутов.
Может ли это быть оправдано?
Моя точка - нет. В СУБД всегда есть способ избежать этого. Это ужасно. И если EAV предназначен для использования, то лучшим выбором может быть нереляционная база данных.
Это действительно зависит от ваших целей. Первое лучше для ограничений типа данных, так как вы можете определить/ограничить введенные значения (т. Е. Убедиться, что это действительная дата). Второй может быть более гибким, если вы добавите больше «атрибутов» позже, так как вам не нужно будет изменять структуру таблицы. Есть больше плюсов и минусов каждого, поэтому вам действительно нужно понять, что вы хотите сделать, чтобы хранить и запрашивать данные. –
В основном используется первая структура. Используйте только второй вариант, если вы изменяете атрибуты все время. –