Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当一个表中有两列分别是唯一的时,它叫什么?_Sql_Database Design_Sql Server 2012_Key_Rdbms - Fatal编程技术网

Sql 当一个表中有两列分别是唯一的时,它叫什么?

Sql 当一个表中有两列分别是唯一的时,它叫什么?,sql,database-design,sql-server-2012,key,rdbms,Sql,Database Design,Sql Server 2012,Key,Rdbms,正如问题所问,我想知道当一行可以由两个单独的列唯一标识时,您会如何称呼它 很抱歉,我没有格式化,但这里是: A列:1,2,3,4,5 B栏:A、B、C、D、E C列:1,2,1,2,1 D列:A,A,B,B,A 那么A列和B列都是各自的主键?我不认为这是正确的,那么你会用“键”来称呼它吗?如果你的意思是每一行总是有一个唯一的a值,每一行总是有一个唯一的B值,那么每一行都是一个“超级键”。(实际上,集合{A}和{B}。) 答案是,这个表有两个单列超键 但根据您的数据,两个超键中没有更小的列集是一个

正如问题所问,我想知道当一行可以由两个单独的列唯一标识时,您会如何称呼它

很抱歉,我没有格式化,但这里是:

A列:1,2,3,4,5

B栏:A、B、C、D、E

C列:1,2,1,2,1

D列:A,A,B,B,A


那么A列和B列都是各自的主键?我不认为这是正确的,那么你会用“键”来称呼它吗?

如果你的意思是每一行总是有一个唯一的a值,每一行总是有一个唯一的B值,那么每一行都是一个“超级键”。(实际上,集合{A}和{B}。)

答案是,这个表有两个单列超键

但根据您的数据,两个超键中没有更小的列集是一个超键,每个列也是一个“候选键”。(唯一较小的集合是{},但它不是给定数据的超键。)

所以这里一个等价的答案是,这个表有两个单列候选键

5NF中有这样一个基表,可以保存示例数据。将其分解到其他表中没有任何好处

有一个传统是选择一个候选键作为“主键”。然后,每一个都是一个“备用键”。但这并不是一个特别有用的传统


在SQL中,
主键
唯一非空
实际上声明了一个超键。每个表只能声明一个
主键。SQL不允许将{}声明为超级键。

是否为备用键?或者模式不好,应该将其拆分为两个表。好的,谢谢!我在学校对这个话题还不熟悉,所以谢谢你的澄清。@Bohemian有两个候选键本身并不违反任何NF。@Bohemian是模糊的,但没有意义,例如(候选或超级)键定义为“可以用来查找行”,所以你的第二个“因为”总是正确的。您是否意识到您的评论中说,每一个具有一列PK和一列UNIQUE NOT NULL的表都不在3NF中?即使对于示例数据:唯一非平凡的FD也有超键的行列式,因此在@Bohemian中,“如果R的每个非素属性都非传递地依赖于R的每个候选键,则关系R是第三范式”(E.F.Codd,1971,数据库关系模型的进一步规范化)换句话说,与任意数量的候选密钥的关系可以满足3NF。在任何一本关于这个主题的好书中或者网上的很多其他地方,你都可以验证这一点。