用户有很多任务。 (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
每个的优点和缺点是什么?
还有其他我没有想过的解决方案吗?
答案 0 :(得分:2)
我个人会改变架构设计。以任务为例,我现在将其视为与用户的多对多关系,而不是目前的多对一关系。因此,这意味着删除列tasks.UserId并添加一个名为UserTasks的新表,该表将任务与定义为(UserId,TaskId,IsOwner)的用户相关联。对于任务所属的用户,IsOwner设置为1,如果共享但属于其他人,则为0。这将使查询更容易,例如,您可以执行单个选择以获取拥有和共享任务,而不是2个单独的查询,并且还避免使用union。