在主键的情况下哪个更好 bigint 或 nvarchar

Posted

技术标签:

【中文标题】在主键的情况下哪个更好 bigint 或 nvarchar【英文标题】:Which is better bigint or nvarchar in case of primary key 【发布时间】:2014-02-26 06:06:12 【问题描述】:

我需要表总线的主键,它存储诸如总线号、总线类型、注册号等信息。我们知道总线号本身是唯一的,可以是主键,但它的数据类型为字符串 减慢搜索速度在表格中,因此另一种可能的解决方案是添加 int 类型的 自动增量字段,但这会增加网络数据,因为每次我需要同时选择两者总线编号和总线 ID(自动递增) 供用户在 winform 上选择。我需要知道哪种方法更好,或者还有其他更好的方法。

表架构方法 1

bus no - nvarchar(10) (primary key)
bus registartion no - nvarchar(10)

方法二

Bus id - int (autoincremnted) (primary key)
Bus no - nvarchar(10)
bus registartion no - nvarchar(10)

【问题讨论】:

请提供架构建议。 永远不要使用 NVARCHAR 作为主键。如果您认为使用 INT 的网络流量很大,您能想象使用 NVARCHAR 还会有多少流量吗?正确设计您的架构,您可以最大限度地减少流量并提高性能。 PK 也不需要 BigInt,因为您永远不会得到那么多公共汽车 :) 您的 BUS 表应该类似于 CREATE TABLE bus (ID INT NOT NULL IDENTITY(1,1), BusName NVARCHAR(255) NOT NULL, RegoNumber NVARCHAR(10) NOT NULL, PRIMKY KEY (ID ))。然后,您始终使用 ID 号作为查找值。 为什么是BIGINTINT 还不够吗? MEDIUMINT 也不够?我对此表示怀疑。 does it worth switching a PRIMARY KEY from the type NVARCHAR to the type INT?的可能重复 【参考方案1】: 数字(非空)列始终是数据库表上主键的最佳选择。数据库引擎可以以最有效的方式存储、索引和查找它们。 不要介意网络流量开销。只需不要查询结果集中不需要的列。避免使用 SELECT * 语句。 如有必要,可以在 SELECT 或客户端程序中轻松完成类型转换(例如,整数到字符串)。

在为您的数据库建模时,最好提前为每个表添加一个主键列,即使您觉得不需要它。给你的主键列一个标准化的名字(tablename + 'id' 是一个通用的命名约定)和类型(integer, uniqueidentifier)并坚持下去。不要混用整型、长型、短型等数据类型,只会使表的连接复杂化。

例如为您的实体总线:

表名为 Bus 主键名称是 BusId 主键类型是 Int

【讨论】:

以上是关于在主键的情况下哪个更好 bigint 或 nvarchar的主要内容,如果未能解决你的问题,请参考以下文章

Realm Android 无法在没有主键的情况下复制或更新对象

主键和唯一键的区别

在不使用主键或辅助键的情况下使用 azure 存储帐户进行身份验证

SQL中有主外键的两表到底那这是主表

使用自引用外键的死锁

Yii——关于无主键的数据表或视图