Tim*_*Tim 7 database polymorphic-associations
我有一个存储注释的表,注释可以来自另一个用户,或者是另一个在此应用中是独立实体的配置文件.
我原来的想法是该表将同时具有user_id和profile_id字段,因此如果用户提交注释,则会给user_id留下profile_id为空
这是对的,错的,还有更好的方法吗?
无论最好的解决方案是什么,都取决于恕我直言,而不仅仅是表格,还取决于如何在应用程序的其他地方使用它.
假设注释都与其他对象相关联,假设您从该对象中提取所有注释.在您提出的设计中,提取所有注释需要从一个表中进行选择,这是有效的.但这是在不提取每条评论的海报信息的情况下提取评论.也许你不想展示它,或者它们已经被缓存在内存中了.
但是,如果您在检索评论时必须检索有关海报的信息呢?然后你必须加入两个不同的表,现在结果记录集被污染了很多NULL值(对于配置文件注释,所有用户字段都将为NULL).必须解析此结果集的代码也可能变得更复杂.
就个人而言,我可能会从完全规范化的版本开始,然后在我开始看到性能问题时进行非规范化
对于该问题,还有一种完全不同的可能解决方案,但这取决于它是否在域中有意义.如果应用程序中有其他位置可以互换使用用户和海报,该怎么办?如果用户只是一种特殊的个人资料怎么办?然后我认为解决方案通常应该在用户/配置文件表中解决.例如(一些缩写的伪sql):
create table AbstractProfile (ID primary key, type ) -- type can be 'user' or 'profile'
create table User(ProfileID primary key references AbstractProfile , ...)
create table Profile(ProfileID primary key references AbstractProfile , ...)
Run Code Online (Sandbox Code Playgroud)
然后,您的应用程序中可以互换使用用户或配置文件的任何位置,您可以引用LoginID.
过去,我使用了集中式注释表,并为其引用的 fk_table 有一个字段。
例如:
comments(id,fk_id,fk_table,comment_text)
Run Code Online (Sandbox Code Playgroud)
这样您就可以使用 UNION 查询来连接多个源的数据。
SELECT c.comment_text FROM comment c JOIN user u ON u.id=c.fk_id WHERE c.fk_table="user"
UNION ALL
SELECT c.comment_text FROM comment c JOIN profile p ON p.id=c.fk_id WHERE c.fk_table="profile"
Run Code Online (Sandbox Code Playgroud)
这确保您可以扩展具有注释的对象数量,而无需创建冗余表。
| 归档时间: |
|
| 查看次数: |
1447 次 |
| 最近记录: |