Лучший способ управления данными конфигурации

#database-design #configuration #saas

Вопрос:

Я работаю над приложением SaaS, в котором у каждого клиента будут разные конфигурации в зависимости от приобретенной версии, дополнительных функций, которые они приобрели, и т.д. Например, у клиента может быть ограничение в 3 пользовательских отчета.

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

Возможные варианты-это таблица с одной записью для каждого клиента, с полем XML, содержащим всю конфигурацию для этого клиента, но это усложняет работу, когда схема XML изменяется для добавления дополнительных функций.

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

Существует ли хороший шаблон для такого типа сценариев, который используют люди?

Ответ №1:

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

Хорошей моделью данных авторизации для такого приложения было бы управление доступом на основе ролей (RBAC). Google — ваш друг.

Ответ №2:

Я думаю, что это будет зависеть от того, как ваш продукт был продан клиенту.

Если вы продаете его только в упаковках…

 PACKAGE 1 -> 3 reports, date entry, some other stuff.
PACKAGE 2 -> 6 reports, more stuff
PACKAGE 3 -> 12 reports, almost all the stuff
UBER PACKAGE -> everything
 

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

Если вы продаете каждый модуль отдельно с вариациями…

 Customer wants 4 reports a week with an additional report every other tuesday if it's a full moon.
 

Тогда я бы —

 Create a table with all the product features.
Create a link table for customers and the features they want.
In that link table add an additional field for modification if needed.
 

клиенты

 customer_id (pk)
 

МОДУЛИ

 module_id (pk)
module_name (reports!)
 

CUSTOMER_MODULES

 module_id (pk) (fk -> modules)
customer_id (pk) (fk -> customers)
customization (configuration file or somesuch?)
 

Для меня это имеет наибольший смысл.

Ответ №3:

Почему вы так боитесь изменения схемы? Когда вы измените свое приложение, вам, несомненно, потребуются дополнительные данные конфигурации. Это повлечет за собой другие изменения схемы, так чего же бояться?

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

Происходят изменения схемы; привыкайте к этому 🙂

Ответ №4:

Если ваша база данных SQL Server 2005 , ваша таблица ключей / значений может использовать тип данных SQLVARIANT для поля значения — с третьим столбцом для хранения типа данных, в который вы должны привести его для использования.

Таким образом, вы можете буквально вставлять числа и текстовые значения разного размера в одно и то же поле.

Ответ №5:

Таблица пар значений ключей, но со всем, хранится в виде строки и с другим столбцом (при необходимости), указывающим, к какому типу должно быть приведено значение.

 CREATE TABLE configKVP(clientId int, key varchar, value varchar, type varchar)
 

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