Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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_Database Design_Data Modeling - Fatal编程技术网

Sql 如果我将标识关系从数据库设计的这一部分更改为非标识关系,这意味着什么?

Sql 如果我将标识关系从数据库设计的这一部分更改为非标识关系,这意味着什么?,sql,database,database-design,data-modeling,Sql,Database,Database Design,Data Modeling,我有一个关于这个数据库设计的问题。我有点不确定在数据库中识别和不识别关系之间的区别,这导致了我头脑中的一些困惑 我有这样一个数据库设计:(有点像电影租赁店。“朋友”是那些借电影的人。“工作室”是合作制作电影的制作工作室。) 我有点理解它是如何工作的。但是,我想知道如果我在loan表中创建一个loan\u id,并使用movie\u id和friend\u id作为普通外键会怎么样 我的一些问题是: 后一种方法的优点或缺点是什么? 初始模型或后期模型更好的情况? 初始模式是否允许朋友多次借用电影

我有一个关于这个数据库设计的问题。我有点不确定在数据库中识别和不识别关系之间的区别,这导致了我头脑中的一些困惑

我有这样一个数据库设计:(有点像电影租赁店。“朋友”是那些借电影的人。“工作室”是合作制作电影的制作工作室。)

我有点理解它是如何工作的。但是,我想知道如果我在loan表中创建一个loan\u id,并使用movie\u idfriend\u id作为普通外键会怎么样

我的一些问题是: 后一种方法的优点或缺点是什么? 初始模型或后期模型更好的情况? 初始模式是否允许朋友多次借用电影


任何详尽的解释都将不胜感激。

您拥有所有多对多表(表协作、贷款、角色)的方式称为复合主键:其中两个(或更多)列构成唯一值

当你有一个复合pk时,很多db设计者更喜欢创建一个代理主键(比如你建议的loan_id)。我是他们中的一员。这篇文章很好地解释了为什么或为什么不

我相对简单的理由是,复合键会增长:以贷款为例,如果电影贷款不止一次会发生什么?使用复合方法,您必须将loan_date添加到复合键中


如果你想追踪某种形式的再贷款呢?然后,您必须有一个第二个表,其中包含贷款表中的所有组合pk字段(原始贷款电影id、原始贷款朋友id、原始贷款日期)才能引用原始贷款…

贷款
表中,您需要保证以下列是唯一的:

  • 电影id(替换为
    copy\u id
    假设一部电影有多个副本)
  • 朋友身份证
  • 贷款日期
…因为我,或者其他任何人,应该能够多次租用同一部电影。这些也是最有可能被搜索到的列

考虑到这一点,将名为
loan\u id
的列定义为表的主键的想法是多余的。ORM已经强制使用非复合主键来简化查询

但它使查询更容易。。。 乍一看,它使删除或更新特定贷款/etc变得更容易-直到您意识到需要首先知道适用的id值。如果您必须根据电影、用户/朋友和日期搜索id值,那么您最好首先直接使用这些条件

但是复合键很复杂。。。 在本例中,主键约束将确保三列(movie_id、friend_id和loan_date)是唯一的,并使用表的最佳索引对其进行索引(如果聚集索引不存在,那么现在大多数数据库会自动索引主键)

单独的主键方法意味着
loan\u id
使用表的最佳索引进行索引(SQL Server和MySQL称它们为聚集索引,对Oracle来说它们都只是索引),并且需要额外的复合唯一约束/索引。某些数据库可能需要超出唯一约束的附加索引。。。因此,这使得数据模型更加复杂,而且毫无益处:

  • 有些数据库,如MySQL,对可用于索引的空间量进行了限制
  • 主键得到的是最理想的索引,但该值与表中的数据没有相关性,因此很少使用与主键相关的索引
结论
我还没有看到单列主键优于复合主键的合理理由。

一个可能的原因是主键的部分是(或可能成为)可变的。然后,所有引用的外键也需要更新。在这里的示例中,如果系统用于安排贷款,而有人错误地键入了他想要看电影的日期,该怎么办?@meriton:数据库中的每一列都是可变的,假设您拥有必要的特权。这就是为什么数据库设计/数据建模不适用于迭代开发——不断变化的模型意味着糟糕的需求收集和/或数据库设计/数据建模。真正的问题是-您是否看到业务(在本例中,是财产贷款/租赁视频)在不久的将来发生了实质性的变化?索引论点是错误的,至少对Sql Server来说是如此。聚集索引不必是主键。此外,通常标识(代理键)列是不可变的。@Shlomo:identity只是一个顺序值;强制列中唯一性的是约束(主键或唯一)。正如我之前所说的,如果您有足够的特权,您可以更改值。它可能需要禁用约束和/或使用,但在任何情况下,数据库都包含无法更改的数据。@Shlomo:虽然SQL Server支持在主键以外的列上创建聚集索引,但它仍然过于复杂,与定义复合主键相比没有任何好处。此外,
CASCADE-ON-DELETE
CASCADE-ON-UPDATE
允许外键引用而不删除或延迟约束…因此,由于业务分析和/或设计不佳,为了隔离引用完整性,您建议使用单列键?您假设需求不会改变,我想他们会的。我也不会称之为糟糕的分析,我会很明显地说,假设您的业务需求不会改变是天真的。至于其他原因:插入标识