0

我有一张这样的桌子:

CREATE TABLE `Appointment` (
    id INT NOT NULL AUTO_INCREMENT,
    user_id INT NOT NULL,
    doctor_slot_id INT NOT NULL,
    date DATE NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(user_id) REFERENCES user(id),
    FOREIGN KEY(doctor_slot_id) REFERENCES doctor_slot(id)
);

我希望用户一天不能多次安排与医生的预约。所以我想在医生 ID 和用户 ID 之间添加一个唯一约束,但在这个结构中我不能。我尝试了那些不在 SQL 语法中的东西:

UNIQUE(user_id, doctor_slot.doctor_id)

UNIQUE(user_id, doctor_slot(doctor_id))

UNIQUE(user_id, doctor_id(doctor_slot))

但如你所知,他们没有工作。你有什么建议吗?

4

1 回答 1

0

根据您对医生槽位的评论,您的架构设计似乎有点问题。您应该没有理由在约会表中同时存储 slot_id 和日期,因为医生槽已经有一个日期组件,因此将日期存储在约会表中是数据的冗余存储,并且可能会成为问题保持同步。

当然,如果没有这个表上的日期,就不可能在数据库中为这个表强制一个唯一的约束。

对于像这样的任何类型的基于日历的应用程序,我的建议是首先创建一个日期表。我通常使用像这里这样的脚本: http ://www.dwhworld.com/2010/08/date-dimension-sql-scripts-mysql/ 来创建这个日期表。拥有这样的表可以让您使用简单的 date_id 来引用有关日期的各种不同信息(这是数据仓库中常用的技术)。只要您在需要日期的所有其他表中使用此 date_id,以您想要的任何方式(按星期几、月份、星期数、是否是工作日等)查看日期都非常简单.)。

您可以使用类似的概念来构建您的时间段。也许制作一个包含 96 个条目(24 小时 * 15 分钟)的表来表示 15 分钟的间隔——显然你可以将它更改为你喜欢的任何间隔。

然后,您可以像这样构建您的约会表:

appointment_id
user_id
doctor_id
date_id
time_start_id <= time slot for appointment start
time_end_id <= time slot for appointment end

我在这里没有看到对医生插槽表的单独需求。如果您想跟踪打开的医生插槽,您也可以在此表中通过简单地设置 user_id = NULL 来执行此操作,直到插槽被填满。

这将允许您对 user_id 和 date_id 强制执行唯一索引。

于 2013-05-14T21:26:38.207 回答