对于现有数据库,我们正在考虑改进部分数据库设计。
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字段可能有不同的数据类型。但是我希望有人可能有类似的情况,并且可以想出这个问题的完整解决方案。
这将允许我们添加标准,而无需不断更改许多表结构。
答案 0 :(得分:0)
听起来你应该有一个表,它有25个公共表中的核心字段,还有一个与当前现有表名对应的记录类型的附加字段。然后,您需要一个或几个使用主键的新核心表的补充表,并且还只存储每种记录类型所需的其他字段。如果你发现自己有一组新的专栏只适用于少数现有的表,那很好。您只需要在新补充表中的核心表中记录这些记录。当这些列扩展为包含更多原始表时,将记录添加到补充表很容易。如果需要,您仍然可以从中构建主视图。
答案 1 :(得分:0)
我认为回复你的问题是最终实体的好的属性继承树。如果树将针对问题域进行优化,那么您将拥有没有空值的高效数据库方案。您可以通过合适的ORM关闭sql语句数量的问题。