我正在尝试类似Database Design for Tagging之类的东西,除了我的每个标签都被分组到类别中。
例如,假设我有一个关于车辆的数据库。假设我们实际上对车辆知之甚少,因此我们无法指定所有车辆将具有的列。因此,我们将用信息“标记”车辆。
1. manufacture: Mercedes
model: SLK32 AMG
convertible: hardtop
2. manufacture: Ford
model: GT90
production phase: prototype
3. manufacture: Mazda
model: MX-5
convertible: softtop
现在您可以看到所有汽车都标有其制造商和型号,但其他类别并不完全匹配。请注意,一辆车只能有一个类别。IE。一辆车只能有一个制造商。
我想设计一个数据库来支持搜索所有梅赛德斯,或者能够列出所有制造商。
我目前的设计是这样的:
vehicles
int vid
String vin
vehicleTags
int vid
int tid
tags
int tid
String tag
int cid
categories
int cid
String category
我有所有正确的主键和外键,除了我无法处理每辆车只能有一个制造商的情况。或者我可以吗?
我可以在vehicleTags 中的复合主键中添加外键约束吗?IE。我可以添加一个约束,使得复合主键 (vid, tid) 只能添加到 vehicleTags 中,前提是在 vehicleTags 中还没有一行,这样对于同一个 vid,在 with 中还没有 tid同一个cid?
我的猜测是否定的。我认为解决这个问题的方法是在vehicleTags中添加一个cid列,并制作新的复合主键(vid,cid)。它看起来像:
vehicleTags
int vid
int cid
int tid
这将防止汽车有两个制造商,但现在我已经复制了 tid 在 cid 中的信息。
我的架构应该是什么?
汤姆在我之前的问题中注意到我的数据库模式中的这个问题,你如何做多对多表外连接?
编辑
我知道在示例中制造确实应该是车辆表中的一列,但假设你不能这样做。这个例子只是一个例子。