2011-03-05 28 views
0

例子:如何为具有多种内容类型的类别设计数据库模式?

4类:
- 汽车
- 自行车
- 船
- 飞机

和几个表的内容

文章(ID,标题,正文)
photo_galleries(id,photo_filename ...)
video_galleres(id,video_title,video_url)

,现在我很好奇如何设计数据库架构中的类别划分从这些表的内容...

我想到某事。像这样:

categories_content
- CATEGORY_ID
- article_id的
- photo_gallery_id
- video_gallery_id

但似乎空间大量浪费空的...:/

+0

这些是一个一对多或多对多一对多关系? – tvanfosson 2011-03-05 20:01:32

+0

文章和照片库可以处于同一类别吗? – smartcaveman 2011-03-05 20:17:15

+0

他们可以在多个类别... – Sqrcz 2011-03-06 18:52:48

回答

2

另一个设计中要考虑将每种内容类型创建单独的关系表:

article_category (article_id NOT NULL, category_id NOT NULL) 
photo_g_category (photo_g_id NOT NULL, category_id NOT NULL) 
video_g_category (video_g_id NOT NULL, category_id NOT NULL) 

这种设计消除了需要存储NULL值,将在您的设计需要。所有这些列将被定义为适当表的外键。

浪费的空间对于您的设计并不是真正的问题。 (在大多数数据库引擎中,没有空间用于存储空值。)

设计中的一个更大的问题是确保至少有一个内容FK列被填充,并允许其他列为空。另外,如果允许在一行上填充多个内容FK列,那么您的设计会使添加和删除关系的过程更加复杂。

你打算如何表示与类别相关的内容,例如: 1?

文章:A,B,C photo_g:P,Q video_g:V,W,X,Y,Z

1 a p v 
1 b q w 
1 c - x 
1 - - y 
1 - - z 

OR

1 a - - 
1 b - - 
1 c - - 
1 - p - 
1 - q - 
1 - - v 
1 - - w 
1 - - x 
1 - - y 
1 - - z 

去除类别之间的关系的1和photo_g p会有所不同,在一种情况下需要更新一行,另一种情况是删除一行(没有必要保留一行没有填充任何内容FK值的行)。

我建议三个独立的表来保存这些关系:

article_category: 
a 1 
b 1 
c 1 

photo_g_category: 
p 1 
q 1 

video_g_category: 
v 1 
w 1 
x 1 
y 1 
z 1 
+0

我喜欢这个想法,除了(类别,类型,项目)系统的事实,我不得不作出另一个“类似”表类型,当然还有添加/删除问题。 在这种情况下,我只会在特定模型中调用特定表。 谢谢。 – Sqrcz 2011-03-06 18:54:42

1

你可以有关系的表如:

category_id, type_of_item, item_id

其中type_of_item是文章,照片,视频等,item_id是该条目中的条目的ID。

+0

听起来很合理:) 会尝试。谢谢。 – Sqrcz 2011-03-05 20:02:20

相关问题