我有一张这样的表:
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)
);
我希望用户不能在一天内安排多次与医生预约。所以我想在doctor_id和user_id之间添加一个唯一的约束,但在这个结构中我不能。我尝试了那些不是SQL语法的东西:
UNIQUE(user_id, doctor_slot.doctor_id)
和
UNIQUE(user_id, doctor_slot(doctor_id))
和
UNIQUE(user_id, doctor_id(doctor_slot))
但是如你所知,他们没有工作。你有什么建议吗?
答案 0 :(得分:0)
根据您对doctor_slot的评论,您可能会对架构设计存在一些问题。你应该没有理由在提交表中存储slot_id和日期,因为doctor_slot已经有一个日期组件,因此将日期存储在约会表中是一个冗余的数据存储,并且可能会成为问题。保持同步。
当然,如果没有此表上的日期,则无法在此表的数据库中强制使用唯一约束。
我建议任何类型的基于日历的应用程序都是首先创建一个日期表。我通常使用像这里的脚本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
我在这里看不到对doctor_slots表的单独需求。如果你想跟踪开放的医生插槽,你也可以在这个表中通过让user_id简单地= NULL直到插槽被填满来实现。
这将允许您在user_id和date_id上强制执行唯一索引。