模型数据库中的异构类型
Posted
技术标签:
【中文标题】模型数据库中的异构类型【英文标题】:Model Heterogeneous Type in Database 【发布时间】:2009-02-03 13:53:39 【问题描述】:我正在尝试找出在我的系统中为一组“类”建模的最佳方法。请注意,我不是在谈论 OO 类,而是响应类(在调查中)。所以模型是这样的:
可以用三种不同类型的数据定义一个类:
一类编码响应(其中编码响应由字符串标签和整数值组成)
一类数值响应(定义为一组区间,其中每个区间的范围从最小值到最大值)
一类字符串响应(定义为一组正则表达式模式)
现在我们有:Class 表(用于定义唯一的类)和一个 ClassCoded、ClassNumeric 和 ClassString 表(都带有 ClassID 作为 Class 表的外键)。
我的问题是,现在一个类在技术上可以被这个系统编码和数字。有没有办法定义一组表来处理这种情况?
【问题讨论】:
您能否详细说明您将放置这些表格的实际用途? 【参考方案1】:处理子类型有两种主要方法,通过为每个可能的属性添加列来使用稀疏列(最好使用检查约束以确保只有一种类型具有值),或者为超类型创建一个表,然后为超类型创建三个表子类型,每个都有返回超类型表的外键。然后添加一个检查约束,确保三个可能的类型列中只有一个不为空。
我个人根据子类型的相似程度来决定使用这两种实现中的哪一种。如果 90% 的列是共享的,我使用稀疏列方法,如果共享的信息很少,我使用多表方法。
【讨论】:
感谢 Shane,我们现在最终使用了每个子类型实现的表,我不确定用户是否喜欢您提到的替代方案。我只是想看看是否有一些优雅的方式来以另一种方式处理这个问题【参考方案2】:关系数据库不能优雅地处理这个问题。最简单的方法是为所有不同类型的数据定义列,并且只填充适当的列。
【讨论】:
【参考方案3】:我不明白问题是什么。这只是混合继承。为什么一个类不能只拥有一个 ClassCoded 和 ClassNumeric 的条目?
无论如何,业务规则的实施不会在数据库中完成,因此您可以轻松地在业务层代码中实施这些约束,并为在这两个表中都有条目的类使用特殊规则。
【讨论】:
我们有一个要求,一个类必须是一个并且只有一个子类型。例如,年龄(一个数字变量,具有数字类)不应该将一类编码响应应用于它,如婚姻状况(一个编码变量)以上是关于模型数据库中的异构类型的主要内容,如果未能解决你的问题,请参考以下文章