1

如果我有三个表:

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

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

  • 使用触发器模拟级联删除
  • 将项目类型存储在 music_types、矿物和动词表的每一行中,并使用它作为额外的外键
  • 在 pages 表中存储适当的表名
  • 使用 PHP 等维护数据库的完整性。

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

4

1 回答 1

3

我认为你的问题在这里

模板将知道外键与特定的相关表相关,

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

我看到了两种方法:

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

  2. 有一个具有唯一 id 的“主事物”表,然后页面可以引用该表,具有标识类型的列和指向其余唯一数据的列,这些数据将存储在不同的表中。

于 2009-09-26T15:16:07.000 回答