我说的是主键的规范化。因此,假设我的主键列是nvarchar类型,这违反了规范化规则。从所需列中移除主键约束和标识规范之后。我需要创建一个新列,它将成为该表的新主键。
我的问题是,前一个主键应该发生什么?我得到了一个听起来像这样的答案:“这个列应该成为一个语义键”,但我不能理解这个答案。
发布于 2019-06-14 11:43:01
在设计数据库模式时使用代理主键并不少见。其思想是为每条记录提供一个唯一且永久的标识符,以便应用程序和外键可以轻松引用它。这个密钥没有任何意义。知道代理键不会给您提供有关记录内容的信息。您的应用程序的用户永远不会看到此值。
另一方面,您的记录可能具有语义主键。这是一个唯一的值,用于标识对用户有意义的数据。
例如,假设您有一个雇员表。雇主为每个员工分配一个唯一的员工ID号码。假设您将该值存储为一个字符串。对于用户来说,该值充当引用该员工的唯一标识符。同时,您的表可能有一个数值列,用作该记录的唯一标识符。
create table Employee ( EmployeeRecordID int identity(1,1) primary key,
EmployerAssignedID nvarchar(12),
EmployeeName nvarchar(60),
Salary money )
insert into Employee ( EmployerAssignedID, EmployeeName, Salary ) values
( '#ABC100', 'Fred', 25000.12 ),
( '#AZZ314', 'Mary', 37700.00 ),
( '#MAA719', 'Fran', 34444.04 ),
( '#MZA977', 'Mary', 36000.00 )
添加每条记录时,SQL Server将为每条记录生成一个从1开始的唯一EmployeeRecordID。这是代理键。在数据库和应用程序中,您可以使用此值来引用记录。
但是,当您的应用程序与用户通信时,您将使用EmployerAssignedID。这是语义主键。对于您的用户来说,使用此值来搜索特定的员工是有意义的。
发布于 2019-06-14 12:02:48
主键只不过是唯一的索引,不能将NULL
值作为键。与任何索引一样,它可以是集群的,也可以是非集群的。
删除聚集索引会使表变成一个结构和行为发生变化的堆。删除非聚集索引只是释放其空间,并且不会影响该表以及该表上的其他索引。
因此,在删除之后,您只有一个具有唯一值的列,并且您能够将它们视为语义键,直到插入一些重复的值为止。
https://stackoverflow.com/questions/56597198
复制