Tiny Asked: 2023-08-31 17:04:23 +0800 CST2023-08-31 17:04:23 +0800 CST 2023-08-31 17:04:23 +0800 CST 数据库设计——规范化查询 772 我是一名老师,正在询问我们考试委员会给出的解决方案。问题如下所示,我想寻求帮助来理解为什么我的解决方案不可接受。 这是原始问题/场景: 这是我的解决方案: 我们的审查委员会给出的解决方案如下所示。正如您将看到的,它们表明需要“AssignedSeat”实体。我了解他们在这里解决多对多关系,但我问我的解决方案(蓝色)仅使用这两个实体是否同样有效? 标准分数计划 database-design 1 个回答 Voted Best Answer Renzo 2023-08-31T20:22:19+08:002023-08-31T20:22:19+08:00 您的解决方案并不同样有效,因为它具有可以消除的冗余。考虑一位客户为某场演出预订了 10 个座位。在您的例子中,您有 10 行(每行有 3 个项目,总共 30 个项目)来表示这一事实。相反,在所示的解决方案中,只有 23 个项目来表示相同的信息(10 行包含 2 个项目,单行包含 3 个项目)。由于冗余在数据库设计中不好,因此具有三个关系的解决方案比仅具有两个关系的解决方案更好。 从形式上来看,我们有 ShowingId, SeatNumber -> CustomerId 但在关系 中BOOKING(CustomerId, ShowingId, SeatNumber),该对(ShowingId, SeatNumber)不是候选键,因此该关系不是 Boyce-Codd 范式(尽管它是第三范式)。
您的解决方案并不同样有效,因为它具有可以消除的冗余。考虑一位客户为某场演出预订了 10 个座位。在您的例子中,您有 10 行(每行有 3 个项目,总共 30 个项目)来表示这一事实。相反,在所示的解决方案中,只有 23 个项目来表示相同的信息(10 行包含 2 个项目,单行包含 3 个项目)。由于冗余在数据库设计中不好,因此具有三个关系的解决方案比仅具有两个关系的解决方案更好。
从形式上来看,我们有
但在关系 中
BOOKING(CustomerId, ShowingId, SeatNumber)
,该对(ShowingId, SeatNumber)
不是候选键,因此该关系不是 Boyce-Codd 范式(尽管它是第三范式)。