前提・実現したいこと
Twitterのようなサイトを作ろうとしています。
各アクションのテーブル設計についてご意見を伺いたく存じます。
(実際にTwitterではfollowingとfollowerという双方の視点で別のデータを持っていてその点においてRMDBではないようですが、それは大規模だからゆえのことだと思うので、今回は一般的なRMDBでのご意見を知りたいです)
該当のソースコード
Twitterにはユーザーやツイートに対して、「follow、favorite、block」という3つのアクションがありますが、これらのデータを入れるテーブルを、3つにわけるか、1つにまとめるか、いずれにせよそうすべき妥当な理由を知りたいです。
例えば3つのアクションに応じて以下のようにテーブルを分けてもいいと思いますし、
sql
1CREATE TABLE `follows` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP , 4 `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 5 `user_id` bigint(20) unsigned NOT NULL, 6 `follow_target_id` bigint(20) unsigned NOT NULL, 7 PRIMARY KEY (`id`), 8); 9CREATE TABLE `favorites` ( 10 `id` bigint(20) NOT NULL AUTO_INCREMENT, 11 `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP , 12 `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , 13 `user_id` bigint(20) unsigned NOT NULL, 14 `favorite_target_id` bigint(20) unsigned NOT NULL, 15 PRIMARY KEY (`id`), 16); 17CREATE TABLE `blocks` ( 18 `id` bigint(20) NOT NULL AUTO_INCREMENT, 19 `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP , 20 `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 21 `user_id` bigint(20) unsigned NOT NULL, 22 `block_target_id` bigint(20) unsigned NOT NULL, 23 PRIMARY KEY (`id`), 24);
もしくは以下のように1つのactionsというテーブルにまとめるという方法もあるかと思います。
SQL
1CREATE TABLE `actions` ( 2 `id` bigint(20) NOT NULL AUTO_INCREMENT, 3 `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP , 4 `updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 5 `action_name` varchar(10) NOT NULL, 6 `user_id` bigint(20) unsigned NOT NULL, 7 `target_id` bigint(20) unsigned NOT NULL, 8 PRIMARY KEY (`id`), 9);
このそれぞれについて、「こうするつもりなら3つにわける方が妥当だし、あの機能をつけるつもりなら1つにまとめた方がいい」といったようなケースバイケースの理由を知りたいです。
現状私はactionsで1つにまとめようと思っておりまして、その理由は「followかfavociteした相手一覧リスト」を取得する際に、created_atカラムでのソートをかける必要がないためです。(1つにまとめればソートするまでもなく順番にデータが入っているので、このようなリストの取得が楽だろうという考えです)
その他多様な視点からご意見を頂戴したく思い、このたびこちらへ質問を投稿させて頂きました。
どうぞ宜しくお願い致します。
###追記
追記(5月3日16時)
・質問の趣旨としましては、皆様のご経験から「こういうサイトでは3つに分けた方がよかった、1つの方がよかった」という例を知りたいということになりまして、「すべての例を知りたい」ということはございません。
・特に知りたいこととしましては、3つに分けるメリットになります。どういうケースで3つにわけるといいのかわからない状況です。
回答1件
あなたの回答
tips
プレビュー