【问题标题】:NVARCHAR or INT Primary Key with UNIQUE constraint具有 UNIQUE 约束的 NVARCHAR 或 INT 主键
【发布时间】:2016-05-17 15:00:46
【问题描述】:

我有最大长度为 20 个字符的字母数字数据。我要将此数据存储在类型为NVARCHAR(20) 的列中。

这些数据是CODES,必须是唯一的,所以我决定把它作为主键列。

但是,询问another question,有人“建议”我使用INT 列作为主键。

你怎么看? INT 主键并添加具有UNIQUE 约束或我当前设计的列?

我想我要添加一个我不会使用的新列,因为我需要 NVARCHAR(20) 列进行搜索,并避免重复。换句话说,我 99% 的 where 子句都会有 NVARCHAR 列。

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    我是数字合成主键的忠实粉丝。可以将您想要的键之类的东西声明为unique 并成为键的属性。

    以下是一些原因:

    • 数字键占用 4 或 8 个字节,并且长度固定。这对于构建索引更有效。
    • 数字键通常比字符串键短。这为外键引用节省了空间。
    • 通常使用自动递增列插入合成键。这让您知道插入顺序。注意:在某些应用程序中,知道顺序可能是一个缺点,但这是不寻常的。
    • 如果唯一字符串的值发生变化,您只需在一个地方更改该值,而不是在每个具有外键引用的表中更改。而且,如果您遗漏了外键引用,那么数据库的完整性就会受到威胁。
    • 如果一行由多个键标识,则单个数字键更有效。
    • 合成密钥有助于维护安全性。

    这些只是指导方针——您的问题是为什么合成数字键是个好主意。还有替代问题。例如,如果空间使用是一个非常大的问题,那么数字键加上唯一索引的额外空间可能会推翻其他问题。

    【讨论】:

    • 如果我不打算使用它,我不知道在这里添加一个 INT 主键会有什么好处。我的所有操作都将使用 NVARCHAR(20) 列。
    • 嗨,您可以在 INT 列中插入 sring 输入的哈希值(在 oracle 中,您可以使用 ORA_HASH 函数 - 插入表值 (ORA_HASH('somt string) ))需要基于它进行查询,你可以像这样“where myIntColumn = ORA_HASH('INPUT STRING)
    • @VansFannel 。 . .对于索引查找和外键引用,存储整数更有效。
    • @GordonLinoff 还有,唯一约束呢?它有效率吗?因为我需要在表格中搜索该列。
    • @VansFannel 。 . .在字符串列上添加唯一约束是合理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多