Я разрабатываю приложение SaaS для здравоохранения для управления деятельностью в нескольких организациях.Администратор каждой организации может создавать настраиваемые поля для бизнес-концепций.
Пример: пациент org X имеет атрибуты A и B, в то время как пациент org Y имеет атрибуты M и N
После проведения исследования я обнаружил, что существует несколько значительных подходов к проектированию:
Вариант 1 : иметь BusinessObjectCustomField для каждой бизнес-таблицы.Пример для PatientCustomField
OrgID, CustomFieldID, Value
X, A, 1
X, B, 2
Y, M, 3
Y, N, 4
Опция 2 : использовать одну таблицу для каждого бизнес-объекта, но изменять таблицу при добавлении нового настраиваемого поля.В результате num (столбец) ~ num (org) * num (среднее число полей на org)
PatientID A B M N
1 1 2 NULL NULL
2 NULL NULL 3 4
Опция 3 : использовать столбцы общего назначения для хранения данных.В результате num (столбец) ~ max (количество полей в организации)
PatientID Col1 Col2
1 1 2
2 3 4
Опция 4 : сохранение пользовательских данных в формате XML
PatientID CustomField
1 <custom><A>1</A><B>2</B></custom>
2 <custom><M>3</M><N>4</N></custom>
Вариант 5 : создание динамических таблиц на лету
Patient_1
PatientID A B
1 1 2
и
Patient_2
PatientID M N
1 3 4
Мои приоритеты проектирования:
- Хорошая производительность
- Подходит для изменения
- Легко кодировать
- Пробел (так как данных будет много)
Какой вариант выбрать?Я знаю, что MS SQL Server поддерживает индекс для данных XML, но обеспечивает ли он такую же хорошую производительность, как и реляционная индексация?
Ссылки: