我想弄清楚我是否可以摆脱桌子。
现在我有任务和约会。这两个表都有不同的列并存储不同的信息,所以我不能也不会合并这些表。
但是,对于每个任务和约会,您可以设置多个提醒(通过短信、电子邮件和两者发送)。
现在我有 2 个单独的提醒表。它们都具有 FK 所期望的相同列。
那么是否可以为两者使用同一张表?
我看到这种情况发生的唯一方法是我总是在表中同时拥有两个 FK,但一个始终为空(这似乎是错误的)。
我想弄清楚我是否可以摆脱桌子。
现在我有任务和约会。这两个表都有不同的列并存储不同的信息,所以我不能也不会合并这些表。
但是,对于每个任务和约会,您可以设置多个提醒(通过短信、电子邮件和两者发送)。
现在我有 2 个单独的提醒表。它们都具有 FK 所期望的相同列。
那么是否可以为两者使用同一张表?
我看到这种情况发生的唯一方法是我总是在表中同时拥有两个 FK,但一个始终为空(这似乎是错误的)。
你可以这样做
Reminder
- ID
- ReminderDate
- EntityID -- Could be TaskID or AppointmentID
- EntityType -- TASK or APPOINTMENT
INSERT INTO Reminder(@ReminderID, @TaskID, 'TASK')
INSERT INTO Reminder(@ReminderID, @AppointmentID, 'APPOINTMENT')
SELECT * FROM Reminder WHERE EntityID=@TaskID AND EntityType='TASK' -- Reminders for Task
SELECT * FROM Reminder WHERE EntityID=@AppointmentID AND EntityType='Appointment' -- Reminders for Appointment
“我看到这种情况发生的唯一方法是,我总是在表中同时拥有两个 FK,但一个始终为空(这似乎是错误的)。”
我看不出有什么问题。这是您的业务规则。您可以使用检查约束在数据库级别强制执行它(2 个外键 + 检查约束,始终一个字段不能为空,另一个不能为空)。
无论如何,保留此解决方案并拥有适当的外键比使用 EntityID、EntityType 技巧 IMO 更好。
使用数据库功能来强制数据完整性。否则,获得不良数据的可能性会上升。您可以在代码中强制执行一些规则,但您犯错误或强制执行业务规则的可能性远高于使用外键约束等数据库功能。