作为序言,已经提出了类似的问题,但我没有找到任何可以解决具有大量列受此问题影响的表的问题。所有类似的似乎都解决了一个有少量列受此问题影响的表......
- 存储可能是多种不同类型的值的正确方法
- 存储可能是多种类型的值的最佳方式
- 将不同类型的数据存储在单个列中的最佳方法,应该是查询友好的 - MySql
- https://stackoverflow.com/questions/10455783/different-types-for-the-same-column
- https://www.sqlservercentral.com/forums/topic/multiple-data-types-for-the-same-column
...但是我有一个 MySQL 数据库表,其中有许多(例如,30)列当前设置为 data type decimal(5,2)
。
现在,出现了一个新场景,我需要为这 30 列中的每一列输入一个decimal(5,2)
OR a char(2)
(即,一个或另一个,但绝不是两者)。为了给您提供上下文,我输入的是样品中检测到的元素数量,如果未检测到元素的数量,那么我必须能够识别出一个元素已被测试但未检测到,例如“ ND”。我还必须知道该元素是否尚未经过测试。例如,如果列是,那么它可能表明我尚未测试相应的元素。因此,与此场景相关的三种可能情况:DEFAULT NULL
- 一个
decimal(5,2)
值表示该元素已经过测试和检测。 - 值
char(2)
表示该元素已测试但未检测到。 - (
NULL
...?) 值表示该元素未经过测试。
所以,我最初的想法是将更改列的类型更改为 a varchar
,以便列能够存储 achar(2)
或decimal(5,2)
值,但这似乎是一条名为 的危险路径Entity-Attribute_Value
,这可能需要我更多地构建应用层以适应由它引起的限制。
因此,我阅读了“SQL 反模式:避免数据库编程的陷阱”(http://rads.stackoverflow.com/amzn/click/1934356557)一书的第 6 章和其他几篇相关文章,其中两个最常见的答案似乎成为:
1. 使用基于您要执行的查询类型的设计。
就我而言,我想执行多种类型的查询,比较不同行的列值,确定平均值,可能还有更多无法预料的情况。
2.使用Class Table Inheritance
设计。
我想实现该Class Table Inheritance
设计,但这需要为每列创建更多表。考虑到许多列只需要两种数据中的一种,这似乎是一个过于复杂的解决方案。
例如,如果我的理解Class Table Inheritance
是正确的,那么对于我的基表中的 30 列中的每一列,我必须为每个子类型创建一个表,并让它们的主键也作为基表的外键,这意味着我必须创建 60 个表。为了处理可能具有两种数据类型之一的 30 列,创建 60 个表似乎过多。此外,似乎我需要想办法管理这 30 对表,以便它们引用同一列,可能在应用程序层中。
在我结束这篇文章之前想到的一个可能的解决方案是:使用Class Table Inheritance
设计,但不是为我的两种数据类型创建 30 对表,而是为这两种数据类型创建 2 个表并添加一个存储一个值的列关联每对,例如它们将关联的基表列的名称。但这似乎也不是好的做法。
有什么建议么?