我有四张桌子。
PERSON DELIVERY_MAPPING GENERATION_SYSTEM DELIVERY_METHOD
------ ---------------- ----------------- ---------------
ID PERSON_ID ID ID
NAME GENERATION_SYSTEM_ID NAME NAME
DELIVERY_METHOD_ID IS_SPECIAL
示例数据:
PERSON DELIVERY_MAPPING GENERATION_SYSTEM DELIVERY_METHOD
------ ---------------- ----------------- ---------------
1. TOM 1 1 1. COLOR PRINTER 1 1. EMAIL N
2. DICK 1 2 2. BW PRINTER 1 2. POST N
3. HARRY 2 3 3. HANDWRITTEN 3 3. PIGEONS Y
ADELIVERY_METHOD
包含传递新信件的方式 - EMAIL
, POST
, PIGEON
. 该IS_SPECIAL
列将记录标记为特殊交付方式。它由Y
或的简单值表示N
。只有PIGEON
一种特殊的交付方式ie Y
,其他都不是ie N
。
GENERATION_SYSTEM
具有最终将打印这封信的信息。示例值为COLOR PRINTER
和DOT MATRIX PRINTER
。每个都GENERATION_SYSTEM
将始终使用其中一个来交付DELIVERY_METHOD
。GENERATION_SYSTEM
和之间有一个外键DELIVERY_METHOD
。
现在,每个PERSON
人的字母都可以由不同GENERATION_SYSTEM
的 s 生成,因为这是多对多的关系,所以我们有DELIVERY_MAPPING
表,这就是为什么我们在两端都有外键的原因。
到现在为止还挺好。
我需要确保如果一个人的信件是由使用特殊传递方法的系统生成的,那么他不能被允许在映射列表中拥有多个生成系统。例如,Dick 无法使用彩色打印机生成他的信件,因为他的所有手写信件都已经由一只鸽子投递(这是一种特殊的投递方式)。
我将如何完成这样的约束?我尝试在表上使用插入或更新前触发器来执行此操作,DELIVERY_MAPPING
但这会在更新时导致变异触发器问题。
Can is normalise this scenario even more? Maybe it is just that i haven't normalised my table properly.
Either way, I'd love to hear your take on this issue. I hope I've been verbose enough (...and if you can propose a better title for this post, that would be great)