【问题标题】:Trouble structuring table for unique index为唯一索引构建表时遇到问题
【发布时间】:2013-10-31 16:11:48
【问题描述】:

我在为唯一索引构建表时遇到问题。

我有一张表,里面的物品是预留的,有几个字段用来组成

ItemID - INT
Date - DATE
TimeOfDay - INT (morning = 1, afternoon = 2)
ReservationStatus - VARCHAR (expired, cancelled, confirmed, cancelled by admin)

问题在于 ReservationStatus 字段。系统应允许已取消的多行,但只有一个已确认或已过期(应用程序从已确认更改为已过期)。我没有想法,任何帮助将不胜感激。

编辑:

全表结构

ReservationID - PK Auto-incrementing Integer
SubItemID - INT FK
MemberID - INT FK
Date - DATE
TimeOfDay - INT
ReservationStatus - VARCHAR

SubItemID、Date、TimeOfDay、ReservationStatus 必须是唯一的:同一天下午不能有多个会员预订同一个 SubItem。

我通过我的应用程序验证了这一点,但是我想通过表结构确保完整性(以防程序员出错)。

【问题讨论】:

  • 这是完整的表吗?是否有与每一行关联的用户 ID?您还考虑过使用 ENUM 代替 VARCHAR 来表示预订状态吗?
  • “系统应该允许多个行被取消” 同一个ItemID?还有,桌子的PK是多少?
  • @acyclic - 我省略了其他字段,请参阅编辑。对不起,我对 ENUM 不熟悉,现在会研究它。
  • @geomagas - 是的,对于相同的 SubItemID。我已将 PK 包含在编辑中。抱歉有点含糊。

标签: mysql normalization unique-index


【解决方案1】:

要在具有唯一键约束的表结构中实现此业务规则,您将不得不做一些不自然的事情。

您可以添加一个名为 CancellationCode 的列。使它成为一个 INT。在该列中保留值 0 表示活动/过期,并将其设为默认值。然后,如果您取消预订,请为该行中的 CancellationCode 分配一个唯一的非零值。您可以在该行中使用您的 ReservationID 值,或者您可以拥有一个具有自己唯一 ID 的 Cancellation 表。

您可以保留您的 ReservationStatus 列,以便了解预订的情况。但是,当您查找有效/过期的预订时,请使用 WHERE CancellationCode = 0,以防 CancellationCode 和 ReservationStatus 不同步。

然后让自己成为(SubItemId、Date、TimeOfDay、CancellationNumber)上的唯一索引。这将阻止任何尝试为与现有行相同的 SubItemId、Date、TimeOfDay 值组合插入新的活动预订行。

【讨论】:

  • 难以置信的答案,很容易实现。非常感谢,如果可以的话,我会投票更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 2018-11-23
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2022-08-05
  • 2015-10-21
相关资源
最近更新 更多