我正在设计一个关系数据库,但我没有太多的经验,所以我想问一下关于带照片的关系表的建议。
我想使用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
中对关系表进行更多的分析?
我需要带有更大照片的经典页面和用于浏览其他人的缩略图,我必须考虑该结构可以存储数百万张照片行。
答案 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文章中描述了外键问题的解决方案,其中有一个非常好的示例: