具有多个表的SQL外键

时间:2009-09-26 15:00:59

标签: sql mysql foreign-keys webpage foreign-key-relationship

如果我有三张桌子:

music_genres
-----------
music_type_id
genres
[other unique fields]

minerals
--------
mineral_id
mineral
[other unique fields]

verbs
-----
verb_id
verbs
[other unique fields]

并填充以下内容:

rock
jazz
funk
punk

rock
boulder
stone
shale

rock
wobble
shake
vibrate

现在假设我正在为每个项目显示一个网页,每个项目使用一个单独的模板,并将此信息存储在下表中:

pages
-----
page_id
page_url
template_url
foreign_key_id

使用以下数据:

/page/music-genres/rock/
/music-genres-template.html
1

/page/verbs/rock/
/verb-template.html
1

/page/minerals/rock/
/mineral-template.html
1

/page/minerals/rock/images/
/mineral-images-template.html
1

模板将知道外键与特定相关表有关,因此知道矿物模板查询该表的其他字段的矿物表。但是,我没有任何参照完整性。如果从矿物表中删除了rock,我不能使用级联删除来从页面中删除行,因为外键不是唯一的。我可以想出许多方法来解决这个问题:

  • 使用。模拟级联删除 触发器
  • 存储项目类型 每一行都有音乐类型,矿物质 和动词表,并使用这个 额外的外键
  • 在页面中存储相应的表名称 表
  • 保持完整性 PHP等数据库。

我认为必须有更好的方法来存储我的数据或维护数据库的完整性。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

我认为你的问题就在这里

  

模板会知道a   外键涉及具体   相关表格,

这是未存储在数据库中任何地方的知识。

我看到了两种方法:

  1. 鉴于您实际上是为每种类型的“事物”创建单独的表,您应该为引用页面表中相应表的每种类型的事物设置一个不同的列,将所有列设置为null,除了一个(这可以通过约束强制执行)

  2. 拥有一个'master things'表,其中包含一个唯一的id,然后页面可以引用该表,同时包含一个用于标识类型的列,以及一个指向其余唯一数据的列,这些列将存储在不同的表。