1

ユーザーには多くのタスクがあります。(tasks.user_id = user_id)

タスクには多くのタグがあります ( Acts as taggable onによって実装されます)

ユーザーには多くのリストがあります -> 多くのタスクがあります (リストは複数のタグの単なるラッパーです。たとえば、{List id => 1, name => "shoppingvacation summer"} は、これらすべてのタグでタグ付けされたすべてのタスクを取得します)

たとえば、ユーザーが url tags/shopping%20vacation にアクセスした場合、私のコードは次の検索を行います。

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

task.list_id の参照テーブルまたは外部キーはありません

ユーザーがタスク、リスト、およびタグを他のユーザーと共有できるようにしたい。

タスクを共有するユーザーは、そのタスクだけを別のユーザーと共有します。

リストを共有しているユーザーは、そのリスト内のすべてのタスクを別のユーザーに公開します。

タグを共有しているユーザーは、そのタグでタグ付けされたすべてのユーザー タスクを別のユーザーに開きます。

私には、いくつかのオプションがあり、それぞれの長所と短所について、私が考えていなかった可能性があることを教えてください.

1 つは、共有可能なアイテムごとに異なるテーブルです。

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

個人的には、スキーマの設計を変更します。タスクを例にとると、現在のように多対 1 ではなく、ユーザーとの多対多の関係として扱います。したがって、これは列 tasks.UserId を削除し、UserTasks と呼ばれる新しいテーブルを追加することを意味します。このテーブルは、タスクを (UserId、TaskId、IsOwner) として定義されたユーザーにリンクします。IsOwner は、タスクが属しているユーザーの場合は 1 に設定され、タスクが共有されているが他のユーザーに属している場合は 0 に設定されます。これにより、クエリが簡単になります。たとえば、2 つの個別のクエリではなく、単一の選択を実行して所有タスクと共有タスクの両方を取得し、ユニオンを回避することもできます。

于 2013-03-27T19:58:14.390 に答える