复杂数据库设计:列或数据

时间:2016-08-04 14:39:33

标签: sql-server database database-design

对于现有数据库,我们正在考虑改进部分数据库设计。

25个表具有非常相似的结构,大约90%相同的列和&数据类型。对表格进行相当频繁的更改,例如我们可能需要在这25个表中的7个中添加2个新列。几个月之后,可能还需要在另外5个表中添加2个新列等。我们还会得到这些表中有多少行IsActive(参见下面的示例)= TRUE的问题。这当前意味着创建25个SQL语句,并且语句比这个简单的例子复杂得多。查询25个表然后合并结果只是错误。

我们讨论的一个选项是将所有数据存储在主表中。但总的来说,这意味着拥有相当宽的表和相当多的NULL值。

我们讨论的另一个想法是保留25个表并创建一个组合这些表的主视图。然而,该视图需要大量的手动维护,并且更新可能会被遗忘。该观点仍然有效。

在数据库设计中,其中一个主要概念是:“为了获得最大的灵活性,数据存储在列中,而不是存储在列名中。”这引出了我们的主要问题。有没有人有在表中存储列的经验?这些列实际上包含业务逻辑的过滤条件。

以下是一个例子:

表1:业务规则1

CustomerID (int) | IsPremiumCust (bool) | HasCreditCard (bool) | IsActive (bool) | OrderThreshold (int)

表2:业务规则2

CustomerID (int) | IsPremiumCust (bool) | HasCreditCard (bool) | IsActive (bool) | Discount (int)

还有23个这样的表。所有列都比这个例子更多。

建议:Criteria

Criteria ID | Criteria       | Data Type    
1           | IsPremiumCust  | bool
2           | HasCreditCard  | bool
3           | IsActive       | bool
4           | OrderThreshold | int
5           | Discount       | int

建议:业务规则表

Business Rule ID | Name
     1           | Business Rule 1
     2           | Business Rule 2

建议:交叉表

CustomerID | Business Rule ID | Criteria ID | Criteria Value
------------------------------------------------------------    
      1    |      1           |       1     | TRUE
      2    |      2           |       1     | FALSE

我知道这不起作用,因为Criteria Value字段可能有不同的数据类型。但是我希望有人可能有类似的情况,并且可以想出这个问题的完整解决方案。

这将允许我们添加标准,而无需不断更改许多表结构。

2 个答案:

答案 0 :(得分:0)

听起来你应该有一个表,它有25个公共表中的核心字段,还有一个与当前现有表名对应的记录类型的附加字段。然后,您需要一个或几个使用主键的新核心表的补充表,并且还只存储每种记录类型所需的其他字段。如果你发现自己有一组新的专栏只适用于少数现有的表,那很好。您只需要在新补充表中的核心表中记录这些记录。当这些列扩展为包含更多原始表时,将记录添加到补充表很容易。如果需要,您仍然可以从中构建主视图。

答案 1 :(得分:0)

我认为回复你的问题是最终实体的好的属性继承树。如果树将针对问题域进行优化,那么您将拥有没有空值的高效数据库方案。您可以通过合适的ORM关闭sql语句数量的问题。

相关问题