想象一个由许多客户使用的系统。每个客户都有一些Products和一些Users。这很容易表示为三个表:
+-----------+
+------+ CUSTOMER +-------+
| +-----------+ |
/|\ /|\
+------+ +---------+
| USER | | PRODUCT |
+------+ +---------+
现在,我们要指定客户的用户只能使用该客户产品的子集。这可以表示为四个表:
+-----------+
+------+ CUSTOMER +-------+
| +-----------+ |
/|\ /|\
+------+ +---------+
| USER | | PRODUCT |
+---+--+ +----+----+
| +---------+ |
+------<+ CAN USE +>-------+
+--------++
然而,这不足以确保在属于一个客户的用户和属于不同客户的产品之间不存在连接。
我们可以在代码中或通过触发器限制这一点(添加连接时,检查其用户的客户是否与其产品的客户匹配)。或者我们甚至可以不关心添加无效的连接条目,而是在查询时要小心,只返回有效的条目。
但是有没有办法只使用表关系(外键等)来表示这种限制?