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

时间:2011-03-05 19:50:54

标签: sql database design-patterns database-schema

示例:

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

和几个内容

的表格

文章(身份证,头衔,身体)
photo_galleries(id,photo_filename ...)
video_galleres(id,video_title,video_url)

现在我很好奇如何设计数据库模式以将这些表中的内容划分为类别......

我想到了......像这样:

categories_content
  - category_id
  - article_id
  - photo_gallery_id
  - video_gallery_id

但是对于NULL来说似乎浪费了很多空间......:/

2 个答案:

答案 0 :(得分: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值的需要,这在设计中是必需的。所有这些列都将被定义为适当表的外键。

浪费的空间并不是您设计的真正问题。 (在大多数数据库引擎中,没有空间用于存储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

答案 1 :(得分:1)

您可以拥有关系表,例如:

category_id, type_of_item, item_id

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