描绘许多客户使用的系统。每个客户都有许多产品和一些用户。这很容易表示为三个表:
+-----------+
+------+ CUSTOMER +-------+
| +-----------+ |
/|\ /|\
+------+ +---------+
| USER | | PRODUCT |
+------+ +---------+
现在,我们要指定客户的用户只能使用该客户产品的子集。这可以表示为四个表:
+-----------+
+------+ CUSTOMER +-------+
| +-----------+ |
/|\ /|\
+------+ +---------+
| USER | | PRODUCT |
+---+--+ +----+----+
| +---------+ |
+------<+ CAN USE +>-------+
+--------++
但是,这不足以确保属于一个客户的用户与属于不同客户的产品之间不存在联接。
我们可以在代码或通过触发器限制此项(添加联接时,检查其用户的客户是否与其产品的客户匹配)。或者我们甚至不关心添加无效的连接条目,而是在查询时只注意返回有效的条目。
但有没有办法只使用表关系(外键等)表示这种限制?
答案 0 :(得分:1)
是的,您需要添加Company
表。使用User-Company
创建与User
多对一的User
表,其中包含复合主键Company
和Can use
。然后,更改User
表,使其包含Company
,Product
和User
,其中包含复合外键Company
,User-Company
Product
表,以及Product
表的单列外键 +------+ +----------+ +---------+
| USER | | Customer | | PRODUCT |
+------+ +----------+ +---------+
\ / \ /
| | | |
/|\ /|\ /|\ /|\
+-----------+ +-----------+
| Cust-USER | | Cust-Prod |
+-----------+ +-----------+
Comp FK \ / Comp FK
(Cust, User) -- | | --- (Cust, Prod)
/|\ /|\
+-------------+
| Can Use |
| - customer |
| - product |
| - user |
+-------------+
。
我将在上面留下历史记录,但既然您已编辑了问题,请查看以下内容。
{{1}}
答案 1 :(得分:1)
如果表格是
USER: UID, CID, ...
PRODUCT: PID, CID ...
CAN_USE: CUID, CID, UID, PID
然后
CAN_USE { CID, UID } ---> USER { CID, UID }
CAN_USE { CID, PID } ---> PRODUCT { CID, PID}
最好将CID(客户ID)验证为CUSTOMER表的密钥。