首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >每种数据类型都有列的DB表

每种数据类型都有列的DB表
EN

Software Engineering用户
提问于 2013-07-05 08:21:19
回答 1查看 768关注 0票数 1

我需要设计一个数据库来存储键值数据。键名列表不是固定的,应该在以后扩展。我不想为每个键创建一个列,因为我需要频繁地添加列,而且它可能会变得太大,而且我知道实体属性值设计是没有效率的。我想到了以下类型的表格设计,我在问它是否有意义,有没有人能想出任何与效率、桌子大小或其他问题有关的缺点-

表中的每个列都是不同的数据类型;与键无关的列为NULL:

代码语言:javascript
运行
复制
ID |DataType |KeyName |ValInt |ValSmallInt|ValBool |ValStr  |ValText  |ValDate
-------------------------------------------------------------------------------
1  |1 (int)  |Width   |100    |NULL       |NULL    | NULL   | NULL    | NULL
2  |1 (int)  |Height  |200    |NULL       |NULL    | NULL   | NULL    | NULL
3  |2 (bool) |IsActive|NULL   |NULL       |false   | NULL   | NULL    | NULL
4  |3 (text) |URL     |NULL   |NULL       |NULL    | NULL   | w.com   | NULL
5  |1 (int)  |Size    |4      |NULL       |NULL    | NULL   | NULL    | NULL
6  |4 (date) |Created |NULL   |NULL       |NULL    | NULL   | NULL    | 2/2/2012

列数将作为所有数据类型的数量(大约30?)。

DataType列是int类型的标志,用于调用方-它告诉调用者从哪个列获取值。

每一行实际上都是另一个表中某个对象的属性。一组行为该对象生成一组属性,通常情况下,SELECT将得到整个集合。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2013-07-05 08:41:41

正确的说法是,将不同的键表示为表中的列是个坏主意。正确的做法是将它们表示为不同的行。

这就留下了统一存储不同类型值的问题。备选方案如下

(a)将它们存储在不同的表中,代价是必须执行不同的查询来查找不同类型的值,并且必须使用JOIN检索所有值。根据您的使用模式,这可能是一个好主意。例如,如果您通常查找单个值而不是整个集合,并且调用方知道每个键代表什么类型,那么这就是更好的解决方案。

(b)将它们全部储存在同一表中,而代价是必须对价值栏的类型使用最不常见的分母。这意味着每次检索值时都必须转换或转换该值,并且可能还必须在每个记录中存储一个类型标志。在面向对象的编程语言中,这将是一个可怕的想法,因为他们有更好的多态集合选项,但是如果您想要高效的检索,或者调用方不一定知道每个键的类型,那么它可以是数据库模式的最佳解决方案。

请注意,对于相同的数据,您的解决方案需要更多的列,并且还要求调用方知道要检索哪种类型(或者检查所有可选字段,以确定哪个字段不是NULL)。因此,我将选择(a)或(b),这取决于您典型的使用模式。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/203798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档