数据库模式 - 多态关联与单独的表

时间:2013-03-27 15:23:23

标签: ruby-on-rails database-design

用户有很多任务。 (tasks.user_id = user_id)

任务包含许多标记(通过Acts as taggable on

实现)

用户有很多列表 - >它有很多任务(列表只是多个标签的包装,例如{List id => 1,name =>“shopping vacation summer”}将检索所有标记有所有这些标签的任务)

例如,如果用户转到url tags / shopping%20vacation,我的代码将执行查找:

Task.all.tagged_with(["shopping", "vacation"])

task.list_id

没有Lookup表或外键

我希望用户能够与其他用户共享任务,列表和标签。

共享任务的用户只与另一个用户共享该任务。

共享列表的用户会将该列表中的所有任务打开给另一个用户。

共享标记的用户会将标记有该标记的所有用户任务打开给其他用户。

对我来说,有一些选择,我想对每个我可能没想过的优点和缺点有一些意见。

一个是每个可共享项目的不同表格:

shared_tasks:task_id,shared_to_id(或user_id) shared_lists:list_id,shared_to_id shared_tags:tag_id,shared_to_id

OR:与

的多态关联

shareables:shared_id(item_to_share),shared_to_id,shared_type

每个的优点和缺点是什么?

还有其他我没有想过的解决方案吗?

1 个答案:

答案 0 :(得分:2)

我个人会改变架构设计。以任务为例,我现在将其视为与用户的多对多关系,而不是目前的多对一关系。因此,这意味着删除列tasks.UserId并添加一个名为UserTasks的新表,该表将任务与定义为(UserId,TaskId,IsOwner)的用户相关联。对于任务所属的用户,IsOwner设置为1,如果共享但属于其他人,则为0。这将使查询更容易,例如,您可以执行单个选择以获取拥有和共享任务,而不是2个单独的查询,并且还避免使用union。