【问题标题】:Should i have a primary ID? i am indexing another field我应该有一个主ID吗?我正在索引另一个字段
【发布时间】:2009-11-07 21:18:33
【问题描述】:

使用 sqlite 我需要一个表来保存一个 blob 来存储一个 md5 哈希和一个 4byte int。我打算为 int 建立索引,但这个值不会是唯一的。

我需要这个表的主键吗?索引非唯一值是否存在问题? (我认为没有任何问题或原因)。

【问题讨论】:

  • +1。好问题。就个人而言,我比我自己更喜欢@Larry Lustig 的回答。他的与 sqllite 相关,而我的则更笼统。

标签: sql database-design primary-key data-modeling


【解决方案1】:

就我个人而言,我喜欢在所有表上都有一个唯一的主 ID。它使查找用于更新/删除的唯一记录变得更加容易。

【讨论】:

  • +1:匹配 ORM 对每一行的不可变唯一 ID 的期望。
  • 多对多链接表除外
  • @Alex:实际上,我也喜欢在多对多链接表上添加一个额外的 id 字段。有时,能够按添加的顺序打印出链接是很有用的,即使您最初认为这无关紧要,因此自动递增的主键非常有用。此外,在应用程序中实现删除功能(删除链接)时,如果您可以使用简单的 id 引用行,有时会更容易。
【解决方案2】:

您将如何引用SELECT * FROM Table WHEREUPDATE ... WHERE?你确定要每一个吗?

【讨论】:

    【解决方案3】:

    你已经有了。

    SQLite 自动为每个表的每一行创建一个整数 ROWID 列。如果您不声明自己的,这可以用作主键。

    一般来说,声明自己的主键列是个好主意。在您提到的特定情况下,ROWID 可能适合您。

    【讨论】:

    • 谢谢大卫。我只使用 SQLite 完成了一个项目,但我真的很喜欢它作为一个轻量级但仍然非常非常强大的 DBMS。
    【解决方案4】:

    如果您想具有参照完整性,我的建议是使用主键。但是,索引非唯一值没有问题。唯一的问题是你的表现会下降一点。

    【讨论】:

      【解决方案5】:

      让两个相同的行以某种方式进入该表会有什么后果?

      当然,一个后果是浪费空间。但我在这里谈论的是更基本的东西。有时数据中的重复行会给您错误的结果。例如,如果您按 int 列(字段)分组,并列出每个组中的行数,则重复的行(记录)可能会让您失望,这取决于您真正要查找的内容。

      如果关系数据库基于关系,则它们会更好地工作。关系总是处于第一范式。声明主键的主要原因是防止表脱离第一范式,从而不表示关系。

      【讨论】:

        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 2021-09-15
        • 2017-04-03
        • 1970-01-01
        • 2014-08-21
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多