2008-09-29 48 views
3

我正在开发一个SaaS应用程序,其中每个客户将根据他们购买的版本,他们购买的附加功能等具有不同的配置。例如,客户可能有3个自定义报告。管理配置数据的最佳方式

显然我想将这个配置存储在数据库中,但我不确定最好的方法。我们希望能够在将来添加额外的功能而不需要更改数据库模式,因此具有每个配置列的单个表是不明智的。

可能的选项是每个客户有一个条目的表,其中包含该客户的整个配置的XML字段,但是当XML模式更改以添加附加功能时会增加复杂性。

我们可以使用具有键值对的表,并将所有配置设置存储为字符串,然后解析为正确的数据类型,但这似乎有点混乱,就像为字符串配置选项提供了单独的表一样,整数配置选项等。

对于这种人们​​正在使用的场景,有没有很好的模式?

回答

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?) 

这是很有道理的我。

1

键值对表,但与一切存储为一个字符串,并与另一列(如有必要)存储值应该被转移到哪种类型。

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

如果该值无法转换为该类型,那么您知道这是错误配置,并且没有歧义。

2

如果您的数据库是SQL Server 2005+,您的键/值表可以使用值字段的SQLVARIANT数据类型 - 第三列存储您需要将其转换为使用的数据类型。

通过这种方式,您可以从字面上将数字不同的&不同大小的文本值插入到相同的字段中。

3

其实,我没有看到这里需要不同的配置。您需要的是授权级别和适当的用户界面,而不是显示用户未支付的功能。

这种应用程序的良好授权数据模型是基于角色的访问控制(RBAC)。 Google是你的朋友。

2

你为什么如此害怕架构改变?当你改变你的应用程序时,你无疑会需要额外的配置数据。这将需要其他模式更改,为什么要害怕?

模式更改是您应该能够容忍的事情,纳入您的开发,测试和发布流程,并在未来的设计更改中使用。

模式发生变化;习惯它:)