Sql 数据库中的异构类型模型

Sql 数据库中的异构类型模型,sql,database-design,Sql,Database Design,我正试图找出在我的系统中建模一组“类”的最佳方法。注意,我说的不是OO类,而是响应类(在调查中)。所以模型是这样的: 可以使用三种不同类型的数据定义一个类: 一类编码响应(其中编码响应由字符串标签和整数值组成) 一类数字响应(定义为一组间隔,其中每个间隔的范围从最小值到最大值) 一类字符串响应(定义为一组正则表达式模式) 现在我们有:类表(定义唯一类)和类编码、类数值和类字符串表(所有这些表都有一个ClassID作为类表的外键) 我的问题是,现在一个类在技术上可以由这个系统编码和数字。有没有

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

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

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

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

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

现在我们有:类表(定义唯一类)和类编码、类数值和类字符串表(所有这些表都有一个ClassID作为类表的外键)


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

关系数据库不能很好地处理这种情况。最简单的方法是为所有不同类型的数据定义列,并只填充适当的列

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

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


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

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


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

我不明白问题出在哪里。这只是混合继承。为什么一个类不能同时拥有一个ClassCoded和ClassNumeric条目


无论如何,业务规则的强制执行不会在DB中完成,因此您可以在业务层代码中使用特殊规则强制执行这些约束,这些规则适用于在这两个表中都有条目的类。

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


无论如何,商业规则的执行不会在DB中进行,因此,您可以在业务层代码中使用特殊规则轻松地强制执行这些约束,这些规则适用于在这两个表中都有条目的类。

能否详细说明您将放置这些表的实际用途?能否详细说明您将放置这些表的实际用途?我们有一个要求,即一个类必须是且只能是其中一个亚型。例如,年龄(一个数字变量,带有数字类)不应该对其应用一类编码响应,如婚姻状况(一个编码变量)。我们有一个要求,即一个类必须是且仅是其中一个子类型。例如,年龄(一个数字变量,带有数字类)不应该对其应用一类编码响应,如婚姻状况(一个编码变量)。谢恩,我们现在使用每个子类型实现的表,我不确定用户是否会喜欢您提到的替代方案。我只是想看看是否有一些优雅的方式可以用另一种方式处理这个问题。谢恩,我们现在使用的是每个子类型的表实现,我不确定用户是否会喜欢你提到的替代方案。我只是想看看是否有一种优雅的方式可以用另一种方式处理这个问题