Как бы вы создали и сохранили пользовательские настраиваемые поля в базе данных SQL? - PullRequest
5 голосов
/ 07 июня 2009

Мне нужно разрешить пользователям добавлять новые поля в запись, например, если есть запись контакта, пользователь может захотеть добавить числовое поле «SSN» и поле даты / календаря «Дата рождения». Они будут делать это через пользовательский интерфейс, конечно.

Эти поля должны быть доступны для ввода для всех записей контактов.

Учитывая, что мое приложение работает для многих пользователей одновременно (не развертывание одной компании и т. Д.), И теоретически каждый может добавить свои собственные настраиваемые поля, что было бы наилучшим способом хранения этой информации в базе данных, особенно когда это необходимо быть доступным для поиска?

Ответы [ 3 ]

10 голосов
/ 07 июня 2009

Иметь таблицу, в которой хранятся имена и типы полей.

field_ID     INT
field_name   VARCHAR
field_type   ENUM('int','float','text','richtext')

Иметь таблицу, в которой хранится ссылка на запись в таблице записей, ссылка на запись в таблице полей и значение поля.

fieldvalue_fieldID   INT
fieldvalue_recordID  INT
fieldvalue_value     BLOB

Еще одна проблема - сделать его доступным для поиска - вам нужно будет извлечь любой доступный для поиска контент из этого поля value_value и проиндексировать его. Это будет зависеть от базы данных. В MySQL это можно сделать значением TEXT и добавить к нему индекс MySQL FULLTEXT.

1 голос
/ 20 января 2013

Ваши лучшие варианты:

  1. Разрешить пользователю изменять собственную схему базы данных, возможно, загрузив модуль или запустив скрипт.

  2. Используйте поле XML и базу данных, которая поддерживает индексы и запрашивает содержимое этого поля

Это рекомендует Мартин Фаулер, здесь: http://martinfowler.com/bliki/UserDefinedField.html

1 голос
/ 07 июня 2009

Мы добавляем почти во все наши приложения / продукты дополнительную поддержку атрибутов / полей для обеспечения гибкости для пользователя
Как у нас есть категория продукта, В категории клиент может определить дополнительный атрибут любого продукта.
что мы делаем на уровне БД:
В таблице категорий есть несколько дополнительных столбцов, таких как: Text1Att, Text2Att ... для поддержки текстовых значений, Num1Att, Num2Att ... для поддержки числовых значений, Date1Att, Date2Att ... для поддержки значений даты и времени, ID1Att, ID2Att .. Поддержка идентификатора из другой таблицы, как вы можете добавить выпадающий список, список, ...
Здесь все столбцы имеют тип данных String.
Здесь мы храним

Мы будем хранить мета-информацию здесь, как для Text1Att мета
ПЛА; текстовое поле; 50; правда, ложь, Null;
Заголовок поля; Тип управления; Макс. длина; является Обязательным полем; Требуется пользовательская проверка; Пользовательское сообщение проверки;
место рождения; текстовое поле; 100; правда; правда; неверное значение;
То же самое для числового поля ...
для даты мета информация будет выглядеть
дата рождения; управление календарем; true; true; неверная дата;
Заголовок поля; Управление календарем или может быть другим; требуется; есть Пользовательская проверка; Пользовательское сообщение проверки;


Что делать в таблице продуктов, это добавить одинаковое количество столбцов и иметь тип данных text1Att, .. is varchar, num1Att имеют числовые значения, date1Att имеют дату и время, ID1Att имеют int

Что мы делаем на стороне GUI: На странице определения категории добавьте эти атрибуты и создайте метаинформацию во время выполнения и сохраните ее в таблице категорий.
С другой стороны, когда мы определяем продукт в категории, метаинформация будет считываться и перемещаться из таблицы категорий и заполняться на странице определения продукта, как и другие поля.


Если вам нужна дополнительная помощь, я могу предоставить вам изображения, чтобы вы лучше поняли, как это можно сделать.
Мы опыт и анализ, это очень гибкий подход

...