我只是做了一些基本的规范化,但我没有得到答案,想知道你们是否可以给我一些关于是/否的信息,做什么/不要'等等。
所以,如果我有:
我总是设置一个主键(查找表上的唯一自动增量器),在图像中查找表将是" page_downloads"和" page_includes"但我可以保证这些列永远不会被使用,因为它们只能通过page_id进行查询,对于这么多的定义表也一样。
所以我的问题是:"有什么意义吗?什么是最佳实践?始终创建主键,即使它永远不会被使用或者不打扰创建主键,因为使用索引的int列(引用另一个表中的主键)是可以的。例如图片中的关系(page_id到page_id)。想法"
由于
d
答案 0 :(得分:1)
没有。虽然每个表都应该有一个PRIMARY KEY,但它不一定是代理。在这种情况下,(page_id,file_id)是有效的复合PRIMARY KEY(原样(file_id,page_id))。
答案 1 :(得分:0)
向Strawberry的有效观察添加一些信息。
关于代理键没有绝对的答案或最佳实践,通常归结为个人偏好。使用advantages有disadvantages和surrogate keys。在这些优势中,可以考虑:
不可变性代理键在行存在时不会更改。 这具有以下优点:
应用程序不能丢失对数据库中某行的引用 (因为标识符永远不会改变)。主要或自然关键数据 即使对于不支持的数据库,也可以随时修改 跨相关外键的级联更新。需求 更改[edit]唯一标识实体的属性可能 改变,这可能会使自然键的适用性无效。 请考虑以下示例:
选择员工的网络用户名作为自然密钥。上 与其他公司合并,必须插入新员工。一些 新网络用户名因其用户名而产生冲突 是独立生成的(当公司分开时)。在 在这些情况下,通常必须将新属性添加到自然属性中 key(例如,original_company列)。使用代理键, 只有必须更改定义代理键的表。同 自然键,所有表(以及可能的其他相关软件) 使用自然键必须改变。
某些问题域无法清楚地识别出合适的自然键。 代理键避免选择可能不正确的自然键。
性能[编辑]代理键往往是紧凑的数据类型,例如 作为一个四字节整数。这允许数据库查询单个 键列比多列更快。此外一个 密钥的非冗余分配导致产生的b树索引 完全平衡。代理键也比较便宜 加入(比较的列数要少于复合键)。
兼容性使用多个数据库应用程序时 开发系统,驱动程序和对象关系映射系统, 比如Ruby on Rails或Hibernate,它使用起来要容易得多 每个表而不是自然键的整数或GUID代理键 为了支持与数据库系统无关的操作和 对象到行的映射。
一致性当每张桌子都有一个统一的代理键时,有些 通过编写代码可以轻松实现任务的自动化 与表无关的方式。
验证可以设计遵循a的键值 众所周知的图案或结构,可以自动验证。 例如,打算在某些列中使用的键 某些表可能被设计为“与那些表格不同” 旨在用于另一列或表,从而简化 检测密钥已经存在的应用程序错误 错误的。但是,代理键的这个特性应该是 永远不会被用来驱动应用程序的任何逻辑 他们自己,因为这会违反数据库的原则 正常化。