小编Ray*_*Ray的帖子

试图避免"多态关联"并维护外键参照完整性

我正在建立一个类似于Yelp(推荐引擎,虽然规模较小)的网站,因此系统中将有三个主要实体:用户,地方(包括商家)和活动.

现在我想知道的是如何为每种类型的实体存储照片,评论和"赞美"(类似于Facebook的"赞")等信息,以及它们可以应用于每个对象的信息(例如评论推荐,照片等).现在,我这样做的方式是每个ie的单个表

类型表示的照片(id,type,owner_id,is_main等等)
:1 =用户,2 =地点,3 =事件

注释(id,object_type,object_id,user_id,content等等)
,其中object_type可以是一些不同的对象,如照片,推荐等

Compliment(object_id,object_type,compliment_type,user_id)
其中object_type可以是一些不同的对象,如照片,推荐等

Activity(id,source,source_type,source_id等等)//for "activity feed"
,其中source_type是用户,地点或事件

通知(id,收件人,发件人,activity_type,object_type,object_id等等)
,其中object_type和object_id将用于提供与通知对象的直接链接,例如用户的照片被称赞

但是 阅读 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 now

Photo_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个,所以我想在添加额外内容之后我最终会得到一些不到90个表),就我所知,这不是问题.

非常感谢任何反馈.提前致谢.

编辑:为了清楚起见,我并不担心我最终还有10张桌子.据我所知,表的数量并不是太大的问题(一旦它们被使用)......除非你说20​​0左右:/

mysql database-design comments photo polymorphic-associations

4
推荐指数
2
解决办法
1673
查看次数