2010-01-25 75 views
2

我正在设计一个关系数据库,但我没有太多经验,所以我想问一个关于带照片的关系表的建议。关系数据库,照片,投票和警告

我想用一个table存储photos,并为用户数据和主题链接一个或多个表,所以照片可以链接到不同的主题,例如houses,或trees,在这种情况下,我可以有这种结构:

table_houses 
- house_id 
- house_name 
- house_architect_name, house_..., etc. 

table_trees 
- tree_id 
- tree_name 
- tree_plant_type, tree_..., etc. 

table_photos 
- photo_id 
- photo_filename 
- photo_date 
- photo_user_id 

table_rel_houses 
- rel_id 
- rel_house_id 
- rel_photo_id 
- rel_user_id 
- rel_vote_id 
- rel_warn_id 

table_rel_trees 
- rel_id 
- rel_tree_id 
- rel_photo_id 
- rel_user_id 
- rel_vote_id 
- rel_warn_id 

table_warns, table_votes, etc. 

在这种情况下,关系表应该具有相同的结构,因为在相同的方式工作,而是指向一个不同的主题(房屋或树型)。

数据的结构是否正确或者我应该更多地分析table_rel_votestable_rel_warns中的关系表?

我需要具有较大照片的经典页面和用于导航其他照片的缩略图,我必须考虑该结构可以存储数百万张照片行。

回答

4

你可能要考虑你的模型数据库,如下所示:

table_photos 
- photo_id 
- photo_filename 
- photo_date 
- photo_user_id 
- vote_id 
- warn_id 
- type 
- detail_id 

table_houses 
- id 
- name 
- style 

table_trees 
- id 
- name 
- species 

在这种情况下,您可以定义在type字段中输入您的照片的主题,如1 =树,2 =楼,等你仍然可以为同一主题提供许多照片而不会造成数据重复,但是您将不必使用重复的列架构来构建table_rel_xxx表格。如果可能,我宁愿避免这种情况。

在这种情况下,你就可以建立查询,如:

SELECT 
    table_trees.name 
FROM 
    table_photos 
INNER JOIN 
    table_trees ON 
    (table_trees.id = table_photos.detail_id AND table_photos.type = 1); 

要不干脆查询所有照片,而无需“后期绑定”与特定类型:

SELECT 
    photo_filename 
FROM 
    table_photos; 

你可能有兴趣查看以下与此数据库模型相关的文章:

这些都是试图实现在关系数据库中多态关联,即使是在SQL中在语言层面不支持技术。

这种方法的一个缺点是它使得外键约束非常难以定义。你需要一个外键约束来保证如果table_photos正在引用table_trees中的一行,那么这行确实存在。一种外键问题的解决方案进行了说明,有一个很好的例子,下面的EMC文章:

+1

这是一个很好的建议 – vitto 2010-01-26 14:42:43