SQL表有一行吗?

时间:2009-07-30 18:14:44

标签: sql schema

在数据库中只有一行的表中有什么意义(如果有的话)?

注意:我不是在讨论在表中只有一行的可能性,而是在开发人员故意制作一个总是只有一行的表时。

修改

销售税示例很好。

我刚刚在一些代码中观察到我正在审查三个不同的表,这些表包含三种不同类型的证书(一个SSL),每个表只有一行。我不明白为什么这不是一张大表;我想我错过了什么。

18 个答案:

答案 0 :(得分:10)

当我要求开发人员创建一个配置表来存储需要持久存储但不经常更改的数据的名称 - 值对时,我已经看到了这样的事情。他最终创建了一个包含每个配置变量列的单行表。我不会说这是一个好主意,但我可以肯定地看到为什么开发人员根据他的指示做了。毋庸置疑,它没有通过审查。

  

我刚刚在一些代码中观察到我正在审查三个不同的表,这些表包含三种不同类型的证书(一个SSL),每个表只有一行。我不明白为什么这不是一排的;我想我错过了什么。

这听起来不像是好的设计,除非有一些你不了解的重要细节。如果有三条信息具有相同的约束,相同的使用和相同的结构,它们应该在99%的时间存储在同一个表中。从根本上说,这是表格的重要组成部分。

答案 1 :(得分:8)

对于某些事情,您只需要一行 - 通常是系统配置数据。例如,“当前销售税率”。这可能会在将来发生变化,因此不应该硬编码,但通常在任何给定时间都只需要一个。这种数据需要在数据库中,以便查询可以在计算中使用它。

答案 2 :(得分:8)

这不一定是个坏主意。

如果您想要存储某个全局状态(例如布尔值)怎么办?您希望您的存储过程轻松访问此状态吗?

您可以使用主键创建一个表,其值范围仅限于一个值。

答案 3 :(得分:4)

单行就像一个单例类。目的:控制或管理其他一些过程。

单行表可以充当关键部分或确定性自动机(基于行值的调度程序类型)

在表COMPANY_DESCRIPTION中使用单行,以获取有关该公司的一致数据。在公司信件和地址上使用完整。

单行使用full来包含实际值,例如VAT或Date或Time,依此类推。

答案 4 :(得分:2)

有时可以模拟数据库系统未提供的某些功能。我正在考虑MySQL中的序列。

答案 5 :(得分:1)

用于此目的可能是存储当前版本的数据库。

如果存储用于架构更改的数据库版本,则需要驻留在数据库本身中。

我目前正在分析架构并相应地更新,但我正在考虑转向版本控制。除非有人有更好的主意。

我使用vb.net和sql express

答案 6 :(得分:1)

我为这个http://github.com/Squeegy/rails-settings/tree/master

使用了非常棒的rails-settings插件

设置起来非常简单,并提供了一个很好的语法:

  Settings.admin_password = 'supersecret'
  Settings.date_format    = '%m %d, %Y'
  Settings.cocktails      = ['Martini', 'Screwdriver', 'White Russian']
  Settings.foo            = 123

想要所有设置的列表吗?

  Settings.all            # returns {'admin_password' => 'super_secret', 'date_format' => '%m %d, %Y'}

为您的应用的某些设置设置默认值。这将导致定义的设置返回指定值,即使它们不在数据库中。使用以下命令在config / initializers / settings.rb中创建一个新文件:

Settings.defaults[:some_setting] = 'footastic'

答案 7 :(得分:1)

我真的无法弄清楚为什么这是最好的解决方案。它接缝效率更高,只需要某种配置文件,该文件将包含表格中一行的数据。连接数据库和查询一行的成本会更高。但是,如果这将是数据库逻辑的某种配置。然后根据您使用的数据库类型,这会更有意义。

答案 8 :(得分:1)

我们过去曾经使用过单行表(不常见)。在我们的示例中,此表用于存储可通过Web界面更新的系统范围配置值。我们可能已经走了一个简单的名称/值表的路线,但最终客户端更喜欢单行。我个人更喜欢后者,但它确实取决于偏好,特别是如果这个表永远不会与另一个表有任何关系。

答案 9 :(得分:1)

好笑......我问自己同样的问题。如果您只想存储一些简单的值,并且您的唯一存储方法是SQL服务器,那么这就是您必须要做的事情。如果我必须这样做,我通常最终会创建一个包含多列和一行的表。我见过一些商业产品也这样做。

答案 10 :(得分:1)

具有单行的表可用于存储在所有数据库用户之间共享的应用程序级别设置。例如,“允许的最大用户数”。

答案 11 :(得分:1)

  

在数据库中只有一行的表中有什么意义(如果有的话)?

关系数据库将事物存储为关系:满足某种关系的数据元组。

就像,这个:“VAT 这个百分之现在在我的国家生效了。”

如果只有一个元组满足这种关系,那么是的,它将是表中唯一的一个。

SQL无法存储变量:它可以存储由1元素组成的集合,这是一行表。

此外,SQL是基于集合的语言,对于某些操作,您只需要一个假行集,例如,选择一个常量表达式。

SELECT中的Oracle不能只是FROM,你需要一个Oracle条款。

dual有一个伪卷dual,它只包含一行而且只包含一列。

很久以前,曾经有过两个行(因此名称为7),但在去往版本MySQL的途中丢失了第二行。

MySQL也有此伪,但FROM能够执行不带SELECT 1 FROM dual WHERE NULL子句的选择。但是,当您需要空行集时,它很有用:SSL

  

我刚刚在一些代码中观察到我正在审查包含三种不同类型证书(la SELECT * FROM ssl1 CROSS JOIN ssl2 CROSS JOIN ssl3 )的三个不同的表,每个表只有一行。我不明白为什么这不是一张大表;我想我错过了什么。

当一次需要所有三个证书时,它可能是一种“全有或全有”的情况:

{{1}}

如果缺少证书,如果有,则整个查询不返回任何内容。

答案 12 :(得分:0)

如果您的数据库是您的应用程序,那么存储实现业务逻辑的存储过程可能需要的配置数据可能是有意义的。

如果你有一个可以使用文件系统来存储信息的应用程序,那么我认为在XML或平面文件上使用数据库没有优势,除非大多数开发人员现在精通得多使用SQL来存储和检索数据,而不是访问文件系统。

答案 13 :(得分:0)

在我继承的项目中有一个这样的表设置。它是用于配置数据的,给出的原因是它为非常简单的查询做了:

SELECT WidgetSize FROM ConfigTable
SELECT FooLength  FROM ConfigTable

好的。我们转换为通用配置表:

ID  Name  IntValue StringValue TextValue

这很好地满足了我们的目的。

答案 14 :(得分:0)

CREATE TABLE VERSION (VERSION_STRING VARCHAR2(20 BYTE))

答案 15 :(得分:0)

我在SQLite数据库中使用单个数据作为动态网页中的计数器。这是我能想到的最简单的方法,使其成为线程安全的(或者说是精确的过程安全)。但我不确定这是不是一个好主意。

答案 16 :(得分:0)

我认为处理这些场景的最佳方法是,而不是使用数据库,使用配置文件(通常是XML)或创建自己的配置文件,在启动应用程序时读取。只需几分钟就可以编写代码来读取文件。

这里的优点是没有机会意外地为同一个XML变量添加额外的值,并且它非常适合测试,因为您不需要编写大量代码来测试不同的输入,只需简单的更改到文本值并重新运行应用程序。

答案 17 :(得分:0)

除非在表格上有插入约束作为版本控制的时间戳,否则这听起来不错。