MySQL是否有一个点在查找表上有一个主键,它引用另一个被索引的表上的主键?

时间:2016-05-13 23:21:56

标签: mysql database-design

我只是做了一些基本的规范化,但我没有得到答案,想知道你们是否可以给我一些关于是/否的信息,做什么/不要'等等。

所以,如果我有:

enter image description here

我总是设置一个主键(查找表上的唯一自动增量器),在图像中查找表将是" page_downloads"和" page_includes"但我可以保证这些列永远不会被使用,因为它们只能通过page_id进行查询,对于这么多的定义表也一样。

所以我的问题是:"有什么意义吗?什么是最佳实践?始终创建主键,即使它永远不会被使用或者不打扰创建主键,因为使用索引的int列(引用另一个表中的主键)是可以的。例如图片中的关系(page_id到page_id)。想法"

由于

d

2 个答案:

答案 0 :(得分:1)

没有。虽然每个表都应该有一个PRIMARY KEY,但它不一定是代理。在这种情况下,(page_id,file_id)是有效的复合PRIMARY KEY(原样(file_id,page_id))。

答案 1 :(得分:0)

向Strawberry的有效观察添加一些信息。

关于代理键没有绝对的答案或最佳实践,通常归结为个人偏好。使用advantagesdisadvantagessurrogate keys。在这些优势中,可以考虑:

  

不可变性代理键在行存在时不会更改。   这具有以下优点:

     

应用程序不能丢失对数据库中某行的引用   (因为标识符永远不会改变)。主要或自然关键数据   即使对于不支持的数据库,也可以随时修改   跨相关外键的级联更新。需求   更改[edit]唯一标识实体的属性可能   改变,这可能会使自然键的适用性无效。   请考虑以下示例:

     

选择员工的网络用户名作为自然密钥。上   与其他公司合并,必须插入新员工。一些   新网络用户名因其用户名而产生冲突   是独立生成的(当公司分开时)。在   在这些情况下,通常必须将新属性添加到自然属性中   key(例如,original_company列)。使用代理键,   只有必须更改定义代理键的表。同   自然键,所有表(以及可能的其他相关软件)   使用自然键必须改变。

     

某些问题域无法清楚地识别出合适的自然键。   代理键避免选择可能不正确的自然键。

     

性能[编辑]代理键往往是紧凑的数据类型,例如   作为一个四字节整数。这允许数据库查询单个   键列比多列更快。此外一个   密钥的非冗余分配导致产生的b树索引   完全平衡。代理键也比较便宜   加入(比较的列数要少于复合键)。

     

兼容性使用多个数据库应用程序时   开发系统,驱动程序和对象关系映射系统,   比如Ruby on Rails或Hibernate,它使用起来要容易得多   每个表而不是自然键的整数或GUID代理键   为了支持与数据库系统无关的操作和   对象到行的映射。

     

一致性当每张桌子都有一个统一的代理键时,有些   通过编写代码可以轻松实现任务的自动化   与表无关的方式。

     

验证可以设计遵循a的键值   众所周知的图案或结构,可以自动验证。   例如,打算在某些列中使用的键   某些表可能被设计为“与那些表格不同”   旨在用于另一列或表,从而简化   检测密钥已经存在的应用程序错误   错误的。但是,代理键的这个特性应该是   永远不会被用来驱动应用程序的任何逻辑   他们自己,因为这会违反数据库的原则   正常化。