2011-05-25 58 views
2

我正在从头开始设计一个程序及其数据库。对于以下情况(SQL 2008 R2,C#),最佳数据库设计是什么:数据库的最大可扩展设计

该程序将销售给具有不同需求的各种客户。这就是为什么我试图尽可能扩展它。在Code-Side中,我使用DI作为基于插件的体系结构。

但是对于数据库端:
每个客户可能想也可能不想向用户/实体添加额外的信息。使用不同的数据类型。我应该如何设计我的数据库,以便能够以最少的触摸轻松添加其他数据?

  • 在所需表格中创建一个附加列,其中存储有关XML或CSV格式实体的任何其他信息,并在代码隐藏中解析。
  • 创建一个新表,其中包含一个实体的ID,并具有一个键/值对列和一个DataType列(例如Key="IsPremiumMember", DataType="boolean", value="true")并将其解析为代码隐藏。

您会建议哪种方法?为什么?
我应该考虑的其他解决方法?
谢谢。

+0

谁将托管数据库?它会在您的服务器上还是在客户的服务器上? – 2011-05-25 13:25:47

+0

这是对他们的。 – Kamyar 2011-05-25 13:27:06

+1

我会尽量避免** EAV **模式(键/类型/值) - 它非常灵活*,但是从SQL性能/可编程性角度来看,这是一个完全的噩梦。请参阅[Joe Celko关于避免销毁EAV](http://www.simple-talk.com/sql/t-sql-programming/avoiding-the-eav-of-destruction/)或[第5点中的第3点避免简单的数据库设计错误](http://www.simple-talk.com/sql/database-administration/five-simple--database-design-errors-you-should-avoid/) – 2011-05-25 13:56:54

回答

2

我应该如何设计我的数据库,以便能够轻松添加其他数据,并且触摸最少?

如果可能列的范围是可枚举的,那么您可以使用标准列构建表,并允许客户从可能列的列表中添加附加列。这将是灵活的,而不会在SQL中编码太困难。

如果可能列的范围未知,则可以使用键/类型/值模式。正如marc_s所说,它很灵活,但更难编码SQL。

最后,您可以让您的客户使用他们希望的任何列来定义表格。您的软件必须读取数据库系统列和数据库系统索引表,以确定列名称和索引路径是什么。这种软件至少要难以编写一个数量级,因为SQL将由数据库系统表的结果生成。