单柱桌是好的设计吗?[关闭]


111

有一个只有一列的表可以吗?我知道从技术上来讲这不是非法的,但是它被认为是糟糕的设计吗?

编辑:

这里有一些例子:

  • 您有一个带有50个有效美国州代码的表,但是您无需存储详细的州名。
  • 电子邮件黑名单。

有人提到添加一个关键字段。我的看法是,这单列将是主键。


我在想象只有一个列的表的用例时遇到了一些麻烦。能给我举个例子吗?
Paul Morie 09年

但是至少不要为其创建索引!
Sathya

3
US状态代码是定义一个域的典型例子
Quassnoi

3
我之前曾经看过一个数据库表,该表用于保存应用程序的锁值
Russ Cam

这种模式的用途是创建数据集。主表中的每个记录都有一个SET字段。连接具有相同SET的记录。如何插入具有相同SET的多个记录?“ INSERT INTO设置VALUES()”,然后使用最后一个插入ID作为您的SET ID附加到记录。再说一次,也许我可以使用UUID,但是对此有些不妥。
William Entriken 2012年

Answers:


87

是的,以使表格效率最高的方式设计表格无疑是一个很好的设计。“不良RDBMS设计”通常以低效率为中心。

但是,我发现大多数单柱设计案例都可以从附加色谱柱中受益。例如,州代码通常可以在第二栏中说明完整州名称。或黑名单可以具有关联的注释。但是,如果您的设计确实不需要这些信息,那么最好只使用一列。


168

relational algebra就此而言,这是一元关系,表示“ 此事物存在

是的,最好有一个表来定义这种关系:例如,定义一个域。

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

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


3
+1:该表是一组值,它们恰好是RDBMS的原始类型。
S.Lott

4
+1用于根据关系理论提供答案。
lubos hasko

这是一个很好的示例,该示例具有一个不是自然键的1列表,即消息系统中的Thread表... stackoverflow.com/a/6542556/45767
JeremyWeir 2014年

29

我过去曾经使用过它们。我的一个客户想要自动阻止任何试图使用他拥有的这个大名单中的电话号码进行注册的人,因此这只是一个大黑名单。


19

如果确实有需要,那么我认为没有问题。也许您只是出于某种原因希望显示可能性列表,并且希望能够动态更改它,但无需将其链接到另一个表。


+1-最重要的是,这是我书中的正确答案
Mark Brittingham 2009年

+1简洁明了。
马修·琼斯

3
为什么一个列表不能链接到另一表?
Aheho

2
为什么不?以状态码表为例。您为什么不将其用作对另一个具有地址字段的表的前键约束?
Aheho

1
这是一个很好的例子,这是一个好主意。
凯文

11

我有时发现的一种情况是这样的:

countries_id,仅包含一个与每个国家的数字ID列。

country_description包含具有国家ID的列,具有语言ID的列和具有本地化国家名称的列。

company_factories,包含公司每个工厂的信息,包括位于Wich的国家/地区。

因此,为了保持表中的数据一致性和语言无关的数据,数据库将这种模式与只有一列的表一起使用,以允许外键没有语言依赖性。

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

根据评论编辑: Quassnoi


(来源:ggpht.com

在此架构中,我可以在表company_factories中定义一个外键,该键不需要我在表中包括语言列,但是如果我没有表country_id,则必须在表中包括语言列以定义外键。


2
为什么要有country_id?要插入一个国家/地区,您需要至少使用一种语言知道其名称,这将导致country_id显示在country_description中。没有country_description条目的country_id是没有意义的。“ COALESCE(14243,country_name)返回的空值总裁Barack Obama先生今天与Россия总裁Dmitry Medvedev会面”
Quassnoi

4
@Doliveras:好的,我现在看到+1。但是,我宁愿将ISO 3166-1用于coutry_code。与数字ID不同,三字母的国家/地区代码可让世界上几乎所有能够阅读拉丁字母的人都知道提到哪个国家。
Quassnoi

这是我实现的另一种在同一表中容纳自然语言翻译的方式。当然,结果许多字段为空,但是您可以将数据完整性卸载到自定义触发器。CREATE TABLE “DBA” “myLocalisedTable”( “entry_id” INTEGER NOT NULL DEFAULT AUTOINCREMENT, “master_entry_id” INTEGER NULL, “master_entry_label” VARCHAR(200)NULL, “LANGUAGE_ID” INTEGER NULL, “localised_entry_label” VARCHAR(300)NULL,。
文森特·巴克2009年

7

在少数情况下,单列表有意义。我做了一个数据库,其中有效语言代码的列表是用作外键的单列表。拥有不同的密钥毫无意义,因为代码本身就是密钥。而且由于语言代码描述在某些情况下会因语言而异,因此没有固定的描述。

通常,在任何情况下都需要不包含任何其他属性的权威值列表都是单列表的理想选择。


5

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

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

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

例如。美国两个字母的州缩写;我们运送到的邮递区号;拼字游戏中的合法字词;等等

2)稀疏的二进制属性,即,在大表中,仅对很少的记录有效的二进制属性。我可能会创建一个单独的表,而不包含新的布尔列,该表包含属性为true的记录的键。

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

-Al



4

通常,我已经在查询类型表(例如您描述的状态表)中看到了这一点。但是,如果执行此操作,请确保将列设置为强制唯一性的主键。如果您不能将此值设置为唯一值,则不应使用一列。


虽然在这里使用单个列可能很好,但是请记住,您也可以在其他列上设置唯一性约束。
Stealth Rabbi

2

我通常会说是的。不知道为什么只需要一列。我看到一些有效的例外。这取决于您要实现的目标。

当您考虑数据库的架构时,它们并不是很好的设计,但实际上只能用作实用程序表。

我看过过去有效使用的数字表


1

数据库的目的是使信息相互关联。没有相关数据时,该怎么办?

也许这是某种编译表(例如,名字+姓氏+生日),尽管我仍然不确定为什么要这么做。

编辑:我可以看到使用这种表为某种简单的列表。那是你用的吗?


9
不,数据库的主要目的是存储信息。
斯宾塞·鲁波特

但是电子表格可以存储信息。如果这些信息只是一串不相交的数字和字母,并且它们之间没有相关性,那么这些信息又有什么用呢?
马修·琼斯

该信息很有用,因为使用数据库的应用程序需要此信息,并且它不是固定的集合。也就是说,DB只是放置数据库应用程序将要使用的信息(关系式或其他方式)的最方便的地方。我很确定您会同意我们不会构建应用来证明我们相对于关系理想的纯正。相反,我们构建有用的应用程序。
Mark Brittingham 2009年

@Mark-这就是我的简单列表的意思。猜猜我没有很好地解释自己。
马修·琼斯

1
@SR-不,数据库的主要目的是检索信息。因为感兴趣的行更多时候不依赖于其他数据,所以我认为MJ的原始评论是正确的。
CurtainDog

1

是的,只要该字段是您所说的主键即可。原因是因为如果您插入重复数据,则这些行将是只读的。如果您尝试删除重复的行之一。由于服务器将不知道要删除哪一行,因此它将不起作用。


2
这是荒谬的。没有主键或约束的删除操作将删除所有匹配的行,而不是忽略它们。
Erik Funkenbusch,2009年

1
所谓“不工作”,是指“未按预期工作”,其中包括“嘿,我删除了一行但都消失了”状态。
GWLlosa

或者,如果您尝试从“打开表”视图中删除SSMS中的记录,则实际上将引发一个对话框,指出该记录无法唯一标识,然后什么也不做……
Michael Fredrickson

-1

我能想到的唯一用例是一张单词表,也许是一个文字游戏。您访问表只是为了验证字符串是否是单词:从单词=?的单词中选择单词。但是,用于保存单词列表的数据结构要比关系数据库好得多。

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

因此,尽管这不是非法的,但通常来说,您可能不应该拥有仅包含一列的表。


与此类似的是数字表,可以非常方便地停止循环。
u07ch

-1

我所有的表都至少具有四个技术字段,串行主键,创建和修改时间戳记以及软删除布尔值。在任何黑名单中,您还想知道是谁添加了条目。因此,对我而言,答案是否定的,只有一个列的表没有意义,除非对某些东西进行原型设计。


1
听起来您正在将数据表和事务表混合在一起。我认为,这应该是两件分开的事情。
2014年

-2

是的,那很好。但是ID字段不会伤害到它吗?


7
其实可以。当您有一个确定的有效值列表时,您最后想要的是一个ID字段,因为它暗示这些值不是唯一的。如果“LightBlue”是一个关键,那么你不希望有人以为“LightBlue” ID为1可能会有所不同,从“LightBlue” id为4
杰里米·布尔克

谁说身份证必须是身份?还是钥匙的一部分?
Eric

3
它可能是一个合成密钥,并且原始字段可能对此具有唯一约束。
Mark Canlas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.