在主键的情况下哪个更好 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 号作为查找值。 为什么是BIGINT
? INT
还不够吗? 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 无法在没有主键的情况下复制或更新对象