Database design 数据库设计:有比3字段复合主键更好的方法吗?

Database design 数据库设计:有比3字段复合主键更好的方法吗?,database-design,Database Design,我正试图为一家夜总会建立一个数据库模型,该夜总会有几个地点和几个场地。我在数据库中创建了3个表 Venues Bands VenueSchedule 我认为VenueSchedule将是这两者之间的联接表,主键将是vention\u id和band\u id,这样您就可以查找哪个乐队在哪个场馆演奏过。但问题是,我还需要能够查询乐队何时在该场地演奏,以及哪些乐队将在特定日期在给定场地演奏 VenueSchedule表的主键现在有2个字段。如果我在主键中添加date字段,这会是一种不好的做法吗?有

我正试图为一家夜总会建立一个数据库模型,该夜总会有几个地点和几个场地。我在数据库中创建了3个表

Venues
Bands
VenueSchedule
我认为VenueSchedule将是这两者之间的联接表,主键将是
vention\u id
band\u id
,这样您就可以查找哪个乐队在哪个场馆演奏过。但问题是,我还需要能够查询乐队何时在该场地演奏,以及哪些乐队将在特定日期在给定场地演奏


VenueSchedule表的主键现在有2个字段。如果我在主键中添加
date
字段,这会是一种不好的做法吗?有比这更好的方法吗?

我会使用代理主键和唯一约束。

我会使用代理主键和唯一约束。

我不会这样做。我将使用代理密钥(如SQLServer中的标识)。代理将更快地在上检索,并且您的FK表将更高效、更小,因为您不需要将这三列添加到每个FK表中。在大多数情况下,我非常喜欢使用代理,尽管数据库纯粹主义者会强烈反对,因为代理与表中的其他列没有关系,这是一个严格用于PK的人工列。我了解这个职位,但我还是会使用它们并推荐它们。

我不会这么做。我将使用代理密钥(如SQLServer中的标识)。代理将更快地在上检索,并且您的FK表将更高效、更小,因为您不需要将这三列添加到每个FK表中。在大多数情况下,我非常喜欢使用代理,尽管数据库纯粹主义者会强烈反对,因为代理与表中的其他列没有关系,这是一个严格用于PK的人工列。我理解这一立场,但我还是使用它们并推荐它们。

听起来更像是获取数据的问题,而不是存储问题。设置视图以提供所需的数据,或使用数据仓库以非规范化方式存储数据是报告需求的一个选项


对于存储,如前所述,我建议使用一个表,该表有一个人工主键,该表指向其他三个参考(场地、乐队和场馆时间表),因此一个表将三个连接在一起,这样,您可以使用这个链接到其他三个的查询来编写查询,以获取数据。

听起来更像是获取数据的问题,而不是存储问题。设置视图以提供所需的数据,或使用数据仓库以非规范化方式存储数据是报告需求的一个选项


对于存储,如前所述,我建议使用一个表,该表有一个人工主键,该表指向其他三个参考(场地、乐队和场馆时间表),因此一个表将三个连接在一起,这样,您可以使用这个链接到其他三个的查询来获取数据。

您比我更了解您的数据,但在我看来(场馆id、乐队id、日期)最有可能是VenueSchedule的关键。(场地id,乐队id)意味着每个乐队只能在每个场地演奏一次,或者不需要日期

我建议您在使用代理密钥时要谨慎,正如其他答复所建议的那样。首先,代理密钥不会与复合密钥执行相同的任务:它不会维护数据完整性,因为代理密钥不会阻止同一地点、波段、日期组合被多次插入。这将造成潜在的更新异常,并可能导致不准确的结果


其次,根据提供的信息,您甚至不清楚为什么需要代理密钥或如何使用它。如果该表在其他地方被引用,那么您可能需要使用代理项,但如果您没有使用代理项,那么代理项键在存储和索引中只会增加额外的重量和复杂性,根本没有什么用处。

您比我更了解您的数据,但在我看来(地点id、波段id、日期)最有可能是VenueSchedule的关键。(场地id,乐队id)意味着每个乐队只能在每个场地演奏一次,或者不需要日期

我建议您在使用代理密钥时要谨慎,正如其他答复所建议的那样。首先,代理密钥不会与复合密钥执行相同的任务:它不会维护数据完整性,因为代理密钥不会阻止同一地点、波段、日期组合被多次插入。这将造成潜在的更新异常,并可能导致不准确的结果


其次,根据提供的信息,您甚至不清楚为什么需要代理密钥或如何使用它。如果该表在其他地方被引用,那么您可能需要使用代理项,但是如果您没有使用代理项,那么代理项键在存储和索引中只会增加额外的重量和复杂性,根本没有什么用处。

尽管代理项(
Id
)是我的忠实粉丝,但我倾向于在“依赖实体”中避免使用它们,因为复制数据非常容易。如果我要将
ID
添加到
Schedule
表中,则需要对
(VenueId、BandId、Date、Status)
进行唯一约束,从而向DB添加另一个索引

我添加了
状态
字段以允许取消演出


尽管我非常喜欢代理键(
Id
),但我倾向于在“依赖实体”中避免使用它们,因为复制数据非常容易。如果我要将
ID
添加到
Schedule
表中,则需要对
(VenueId、BandId、Date、Status)
进行唯一约束,从而向DB添加另一个索引

我已经添加了
状态
字段以允许取消p