1

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

任务有很多标签(通过Acts as taggable on

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

例如,如果用户访问 url tags/shopping%20vacation,我的代码会查找:

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

task.list_id 没有查找表或外键

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

共享任务的用户仅与其他用户共享该任务。

共享列表的用户会向其他用户打开该列表中的所有任务。

共享标签的用户将使用该标签标记的所有用户任务打开给另一个用户。

对我来说,有几个选择,我想就每个我可能没有想到的优缺点提供一些意见。

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

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

OR:多态关联

可共享:shared_id(item_to_share)、shared_to_id、shared_type

各自的优缺点是什么?

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

4

1 回答 1

2

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

于 2013-03-27T19:58:14.390 回答