【问题标题】:Model Heterogeneous Type in Database模型数据库中的异构类型
【发布时间】:2009-02-03 13:53:39
【问题描述】:

我正在尝试找出在我的系统中为一组“类”建模的最佳方法。请注意,我不是在谈论 OO 类,而是响应类(在调查中)。所以模型是这样的:

可以用三种不同类型的数据定义一个类:

  • 一类编码响应(其中编码响应由字符串标签和整数值组成)

  • 一类数值响应(定义为一组区间,其中每个区间的范围从最小值到最大值)

  • 一类字符串响应(定义为一组正则表达式模式)

现在我们有:Class 表(用于定义唯一的类)和一个 ClassCoded、ClassNumeric 和 ClassString 表(都带有 ClassID 作为 Class 表的外键)。

我的问题是,现在一个类在技术上可以被这个系统编码和数字。有没有办法定义一组表来处理这种情况?

【问题讨论】:

  • 您能否详细说明您将放置这些表格的实际用途?

标签: sql database-design


【解决方案1】:

处理子类型有两种主要方法,通过为每个可能的属性添加列来使用稀疏列(最好使用检查约束以确保只有一种类型具有值),或者为超类型创建一个表,然后为超类型创建三个表子类型,每个都有返回超类型表的外键。然后添加一个检查约束,确保三个可能的类型列中只有一个不为空。

我个人根据子类型的相似程度来决定使用这两种实现中的哪一种。如果 90% 的列是共享的,我使用稀疏列方法,如果共享的信息很少,我使用多表方法。

【讨论】:

  • 感谢 Shane,我们现在最终使用了每个子类型实现的表,我不确定用户是否喜欢您提到的替代方案。我只是想看看是否有一些优雅的方式来以另一种方式处理这个问题
【解决方案2】:

关系数据库不能优雅地处理这个问题。最简单的方法是为所有不同类型的数据定义列,并且只填充适当的列。

【讨论】:

    【解决方案3】:

    我不明白问题是什么。这只是混合继承。为什么一个类不能只拥有一个 ClassCoded 和 ClassNumeric 的条目?

    无论如何,业务规则的实施不会在数据库中完成,因此您可以轻松地在业务层代码中实施这些约束,并为在这两个表中都有条目的类使用特殊规则。

    【讨论】:

    • 我们有一个要求,一个类必须是一个并且只有一个子类型。例如,年龄(一个数字变量,具有数字类)不应该将一类编码响应应用于它,如婚姻状况(一个编码变量)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多