关系数据库,照片,投票和警告

时间:2010-01-25 17:52:24

标签: mysql database data-structures

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

我想使用table存储photos,以及一个或多个用户数据和主题链接表,以便照片可以链接到不同的主题,例如{{1} },或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_votes中对关系表进行更多的分析?

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

1 个答案:

答案 0 :(得分: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 = Tree,2 = House等。您仍然可以为同一主题拍摄许多照片,而无需重复数据,但您将避免必须使用重复的列模式构建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文章中描述了外键问题的解决方案,其中有一个非常好的示例: