【发布时间】:2011-08-30 17:16:23
【问题描述】:
我正在构建一个类似于 Yelp(推荐引擎,但规模较小)的网站,因此系统中将包含三个主要实体:用户、地点(包括企业)和事件。
现在我想知道的是如何为每种类型的实体以及可以应用的每个对象存储照片、cmets 和“赞美”(类似于 Facebook 的“赞”)等信息到(例如,对推荐、照片等发表评论)。现在我这样做的方式是每个人都有一张桌子,即
照片(id、type、owner_id、is_main 等...)
其中 type 表示:1=用户,2=地点, 3=事件评论(id、object_type、object_id、user_id、content 等...)
其中 object_type 可以是几个不同的对象,例如照片、推荐等Compliment(object_id、object_type、compliment_type、user_id)
其中 object_type 可以是几个不同的对象,例如照片、推荐等活动(id、来源、source_type、source_id 等)
//for "activity feed"
其中 source_type 是用户、地点或事件通知(id、收件人、发件人、activity_type、object_type、object_id 等...)
object_type 和 object_id 将用于提供指向通知对象的直接链接,例如被称赞的用户照片
但是 after reading 一些 posts 在 SO 上,我意识到我无法使用外键保持引用完整性,因为这需要 1:1 关系,并且我的 source_id/object_id 字段可以与 ID 相关联在不止一张桌子上。所以我决定采用保留主要实体的方法,然后将其分解为子集,即
User_Photo (photo_id, user_id) | Place_Photo(photo_id, place_id) |等等……
Photo_Comment (comment_id, photo_id) | Recommendation_Comment(comment_id, rec_id) |等等……
赞美(id,...)
//would need to add a surrogate key to Compliment table nowPhoto_Compliment(compliment_id, photo_id) | Comment_Compliment(compliment_id, comment_id) |等等……
User_Activity(activity_id, user_id) | Place_Activity(activity_id, place_id) |等等……
我在想我可以创建将每个子表连接到主表的视图以获得我想要的结果。另外,我认为它也适合我在 Code Igniter 中的对象模型。
我想我可以留下的唯一表是通知表,因为有很多对象类型(论坛帖子、照片、推荐等),而且这个表无论如何只能保存一周的通知,所以任何参考完整性问题应该不是什么大问题(我认为)。
那么我会以一种明智的方式来解决这个问题吗?我可能忽略了任何性能、可靠性或其他问题?
我能看到的唯一“问题”是我最终会得到很多表(因为现在我有大约 72 个,所以我想在添加额外的),据我所知,这不是问题。
非常感谢任何形式的反馈。提前致谢。
编辑:为了清楚起见,我不担心我最终会得到另外 10 个左右的桌子。据我所知,表的数量并不是什么大问题(一旦它们被使用)......除非你说 200 左右:/
【问题讨论】:
标签: mysql database-design comments photo polymorphic-associations