Любые хорошие рекомендации потребуют гораздо лучшего понимания ваших требований, но вот некоторые комментарии по поводу упомянутых вами вариантов, а также некоторые дополнительные мысли.
1) Дизайн Entity-Attribute-Value (EAV) : этот параметр вы описываете, когда у вас есть таблица, в которой есть столбцы для ColumnName, Type и Value. Преимущество этого варианта заключается в возможности легко размещать неограниченное количество новых столбцов, но я обнаружил, что это болезненно, когда приходит время возвращать значимые данные обратно. Например, скажем, у вас есть строки в этой таблице EAV для {Color, varchar} {Red, Green, Blue} и {Size, varchar} {Small, Medium, Large}. Если вы хотите найти все маленькие зеленые элементы, вам нужно что-то вроде этого (конечно, непроверенный SQL):
SELECT *
FROM ITEMS
WHERE ITEMID IN (SELECT ITEMID
FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
ON ATT.AttributeID = VLS.AttributeID
WHERE ATT.ColumnName = 'Color' AND VLS.Value = 'Green')
AND ITEMID IN (SELECT ITEMID
FROM ITEM_ATTRIBUTES ATT INNER JOIN ITEM_VALUES VLS
ON ATT.AttributeID = VLS.AttributeID
WHERE ATT.ColumnName = 'Size' AND VLS.Value = 'Small')
Сравните это с фактическими столбцами в таблице предметов для цвета и размера:
SELECT *
FROM ITEMS
WHERE COLOR = 'Green' AND SIZE = 'Small'
Кроме того, вам будет сложно поддерживать целостность данных, если это важно для этого приложения (и это почти всегда важно, даже если вам сообщают иначе). В приведенном выше примере вам нужно будет реализовать дополнительную логику, если «Цвет» должен быть ограничен синим, зеленым и красным. Кроме того, вам нужно будет реализовать еще больше логики, если определенные цвета бывают только определенных размеров (например, синие элементы доступны только в маленьких и средних)
2) Пользовательские столбцы : Преимущество простого предоставления пользователю возможности добавлять дополнительные столбцы в таблицу позволяет упростить получение данных, но все проблемы с целостностью данных остаются. Кроме того, вашему приложению обычно требуется дополнительная логика для работы с неизвестными столбцами.
3) Существующие пользовательские столбцы : я работал с несколькими приложениями, такими как CRM, которые предоставляют дюжину или более столбцов, уже имеющихся для определения пользователя. По сути, разработчики помещают в столбцы, такие как «Текст1», «Текст2», «Текст3», «Номер1», «Номер2» и т. Д. Затем пользователи предоставляют информацию заголовка и описания для этих столбцов, и именно это приложение использует для отображать цели. Преимущество этой модели заключается в простом извлечении данных, а также в заранее определенной схеме БД, которая должна упростить логику приложения. Проблемы целостности данных остаются, однако. Другим очевидным недостатком является то, что у вас закончатся предопределенные столбцы, чего вы обычно стараетесь избегать с помощью этого типа решения.
Как и в большинстве проблем проектирования, у каждого решения есть свои недостатки. Мой опыт показывает, что, хотя многие пользователи / клиенты говорят, что им нужны подобные решения, на самом деле они просто пытаются убедиться, что не попадают в ловушку приложения, которое не может расти вместе с их потребностями. Я обнаружил, что на самом деле очень мало мест, где нужен такой дизайн. Я почти всегда могу создать дизайн, который отвечает потребностям расширения клиента, не ставя их в роли дизайнера баз данных.