一列表好设计吗?

只有一列的表可以吗?我知道严格来说这不违法,但是这算是劣质设计吗?

编辑:

下面是一些例子:

  • 您有一个包含50个有效的美国州代码的表,但是不需要存储冗长的州名。
  • 一份电子邮件黑名单。

有人提到要添加一个键字段,在我看来,这一列就是主键。

47653 次浏览

大体上来说,是的。不知道你为什么只需要一个专栏。这里有一些例外,我已经看到有效地使用。这取决于你想达到什么目的。

当您考虑数据库的模式时,它们并不是真正好的设计,但是它们确实应该只用作实用工具表。

I've seen 数字表 used effectively in the past.

数据库的作用是将信息片段相互关联。如果没有相关的数据,你怎么能做到这一点呢?

也许这是某种编译表(即 FirstName + LastName + Birthdate) ,但我仍然不确定为什么要这样做。

EDIT: I could see using this kind of table for a simple list of some kind. Is that what you are using it for?

我以前用过。我的一个客户想要自动屏蔽任何人试图注册一个电话号码在这个大名单,他有,所以它只是一个大的黑名单。

如果有正当的需要,那么我看不出有什么问题。也许出于某种原因,您只是想要显示一个可能性列表,并且希望能够动态地更改它,但是不需要将它链接到另一个表。

是的,这是完全没有问题。但是一个 ID 字段不能伤害它,对不对?

我能想到的唯一用例是一个单词表,可能是一个单词游戏。您访问该表只是为了验证字符串是否为单词: 从 word 中选择 word,其中 word = ?.但是存放单词列表的数据结构要比存放 relational数据库好得多。

否则,数据库中的数据通常被放置在数据库中,以利用数据的各种属性之间的关系。如果您的数据没有超出其价值的属性,那么如何开发这些关系?

因此,虽然不是非法的,但一般来说,您可能不应该只有一个列的表。

relational algebra而言,这是一元关系,意思是“ 这东西是存在的

Yes, it's fine to have a table defining such a relation: for instance, to define a domain.

当然,这样一个表的值应该是自然的主键。

我首先想到的是 prime numbers的查找表。

在极少数情况下,单列表是有意义的。我做了一个数据库,其中有效的语言代码列表是一个单列表,用作外键。没有必要使用不同的密钥,因为代码本身就是密钥。而且没有固定的描述,因为语言代码描述会因语言的不同而有所不同。

一般来说,如果您需要一个权威的值列表,而这些值又没有任何其他属性,那么这种情况就是一列表的好候选者。

我有时发现的一个案例是这样的:

Table 国家 _ id, contains only one column with numeric ID for each country.

Table 国家描述, contains the column with country ID, a column With language ID and a column with the localized country name.

Table 公司及工厂, contains information for each factory of the company, including the country in Wich is located.

因此,为了维护表中的数据一致性和独立于语言的数据,数据库使用只有一列的表的模式来允许没有语言依赖性的外键。

在这种情况下,我认为一个列表的存在是合理的。

编辑回应评论: Quassnoi


(来源: Ggpht.com)

在这个模式中,我可以在 company _ Factory 表中定义一个外键,它不需要我在表中包含 Language 列,但是如果我没有表 country _ id,我必须在表中包含 Language 列来定义外键。

Yes as long as the field is the primary key as you said it would be. The reason is because if you insert duplicate data those rows will be readonly. If you try to delete one of the rows that are duplicated. it will not work because the server will not know which row to delete.

Yes, it's certainly good design to design a table in such a way as to make it most efficient. "Bad RDBMS Design" is usually centered around inefficiency.

但是,我发现单列设计的大多数情况下都可以从额外的列中获益。例如,州代码通常可以在第二列中输出 Full State 名称。或者黑名单可以有相关的笔记。但是,如果您的设计真的不需要这些信息,那么使用单列完全没有问题。

我一直使用单列表——当然,这取决于应用程序设计是否已经使用了数据库。一旦我承受了建立数据库连接的设计开销,我就尽可能地将所有可变数据放入表中。

我可以想到单列表 OTMH 的两种用法:

1)数据项存在。常用于下拉列表。也用于简单的合法性测试。

例如,美国各州的双字母缩写词; 我们运送到的邮政编码; 拼字游戏中的合法词汇; 等等。

2)稀疏二进制属性,也就是说,在一个大的表中,一个二进制属性只对极少数的记录有效。我可以创建一个单独的表,其中包含属性为 true 的记录的键,而不是添加一个新的布尔列。

例如,患有绝症的员工; 年限为360天的银行(大多数使用365天) ; 等等。

艾尔。

No problem as long as it contains unique values.

大多数情况下,我都在查找类型表中看到过这种情况,比如您所描述的状态表。但是,如果这样做,请确保将该列设置为强制唯一性的主键。如果不能将此值设置为惟一的,那么就不应该使用一列。

All my tables have at least four tech fields, serial primary key, creation and modification timestamps, and soft delete boolean. In any blacklist, you will also want to know who did add the entry. So for me, answer is no, a table with only one column would not make sense except when prototyping something.