Проектное решение: динамическое добавление данных вопроса
Мне нужно дать пользователям возможность добавлять метаданные в документы. Еще один способ заявить об этом заключается в том, что пользователям необходимо добавить как минимум 5 категорий в документ.
По сути, я хочу динамически добавлять метаданные (или категории) в документ на специальной основе. Вот варианты, о которых я подумал:
Вариант 1. Должен ли я сделать это путем динамического создания новых столбцов таблицы в базе данных?
Вариант 2. Должен ли я определить 5 столбцов с именами attirbute1,attirbute2,attirbute3,attirbute4,attirbute5, а затем использовать и показывать их только в том случае, если пользователю требуются атрибуты.
Вариант 3: Должен ли я создать таблицу метаданных, которая отслеживает столбцы и данные, связанные с ними?
Как вы думаете, это лучший способ достичь этого? Можете ли вы придумать какие-либо другие способы легко добавить эту функциональность. Проблема в том, что функциональность должна быть очень общей.
7 ответов
Каждый документ имеет уникальный DocumentID.
Просто добавьте еще одну таблицу с тремя столбцами:
DocumentID MetaName MetaData
Затем они могут добавить столько частей метаданных к данному документу. Если все их документы используют одни и те же метаним, то поиск метаданных тривиален.
-Адам
Одна вещь, которую вы не уточняете, это то, является ли число и / или имя атрибутов изменяемым или одинаковым для всех документов. Это несколько изменит мою рекомендацию.
Предполагая, что у вас есть дескриптор объекта, который уникально описывает данный документ, я предлагаю таблицу, которая управляет метаданными. Если у вас есть неизвестное количество атрибутов и неизвестные имена этих атрибутов, я рекомендую что-то вроде этого:
create table DocMetaData
(
DocumentHandle varchar NOT NULL,
MetaDataName varchar NOT NULL,
MetaDataText varchar NOT NULL
);
Затем вы вставляете в эту таблицу, когда у вас есть метаданные, используя наиболее подходящее имя. Если нет строки, нет метаданных. Если есть метаданные, у вас явно есть имя для этих метаданных и сами данные. Вы можете включить обнуляемость в самих метаданных, если вам нужно, хотя я бы, вероятно, просто сделал это пустым текстом (что-то вроде default ''
), а не NULL, потому что вы получаете странное поведение (не получите свою строку!), если вы выбираете столбец, а его нет, и вы явно не запрашивали строки с нулевым значением. Помните, этот дизайн не прописан unique
так что у вас есть возможность, хранить только тогда, когда у вас есть данные...
Конечно, если все возможные атрибуты метаданных известны, вы можете просто их прописать!
Создание динамических таблиц - КОРОЛЕВСКАЯ боль - я бы не делал это здесь.
Это очень похоже на тегирование. Вы, вероятно, можете модифицировать действия-как-теги, чтобы сделать то, что вам нужно.
Я бы пошел с тремя столами.
Документ (Документ)
Категория (определенные категории)
DocumentCategory (таблица ссылок, связывающая документы с категориями)
Единственным недостатком является то, что ваши базы данных могут не поддерживать хороший способ ограничить этот дизайн, требуя, по крайней мере, пять записей в DocumentCategories на документ, но вы можете применить это на уровне приложения.
Я бы пошел с вариантом 3.
Динамическое изменение структуры данных станет очень сложным в обслуживании и может привести к некоторым интересным ошибкам.
Наличие ряда столбцов, которые могут понадобиться или не понадобиться, все равно увеличит сложность, поскольку вам нужно будет проверить, используется ли каждый столбец. Кроме того, вы все равно будете ограничены до 5 столбцов.
Вариант 3, хотя и очень гибкий, и позволяет расти. Просто имейте внешний ключ, ссылающийся на документ, столбец для имени и столбец для значения.
Все эти варианты осуществимы, и нет правильного ответа. Вы должны взвесить различные варианты и выбрать лучшее решение для вашей ситуации.
Вариант 1: выполнимо, но может действительно выйти из-под контроля по мере увеличения количества пользователей. Может также влиять на стоимость хранения.
Вариант 2: Вероятно, самое быстрое решение для реализации, но наименее надежное решение и более высокая стоимость обслуживания. Если вам нужно перейти к 6 столбцам, вам придется добавить еще один столбец и т. Д.
Вариант 3: Вероятно, наиболее надежное решение - иметь таблицу метаданных, которая собирает эту информацию, а затем динамически строить таблицы / столбцы на основе этих метаданных. Это решение также, вероятно, займет больше всего времени и будет стоить больше всего.
Я бы, конечно, пошел с вариантом 3: иметь таблицу с именем DocumentCategories, в которой хранится категория, к которой принадлежит каждый документ. Он не только "более реляционный", но и поможет, если ваши требования когда-либо изменятся: что если вы решите, что завтра вы хотите получить 6 категорий?
Кроме того, он дает вам больше возможностей для запросов: что делать, если вы хотите увидеть, сколько раз использовалась каждая категория, или выбрать документы по категориям? С вариантом 3 это просто соединение, и его можно быстро и легко написать. Варианты 1 и 2 делают выполнение таких простых вещей очень сложным.