1

フォロー/お気に入りシステムを実装したいと思います。データベース/テーブル構造を実装する方法は 2 つありますが、どちらを実装すればよいかわかりません。これらのうち、ベスト プラクティスと見なされるのはどれですか。最も重要なのはその理由です。

すべてのフォロワーを 1 つの文字列にまとめました。すべてのフォロワーを単一の文字列に入れることで、冗長な行の量を減らします。

元。

ID (1) || ユーザー ID (1) || follower_ids (2、3、45)

'CREATE TABLE `users` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `username` varchar(20) NOT NULL, 
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';

'CREATE TABLE `follow` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `user_id` int(10) unsigned NOT NULL,
        `follower_ids` text NOT NULL, 
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';

また

各 follow_id を個別に配置しますが、同じ user_id に対して 3 つの行を持つことで冗長性を追加します。

元。

id (1) || ユーザー ID (1) || フォロワー_id (2)

id (2) || ユーザー ID (1) || フォロワー_id (3)

id (3) || ユーザー ID (1) || フォロワー_id (45)

'CREATE TABLE `users` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `username` varchar(20) NOT NULL,
        PRIMARY KEY (`id`) 
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';

'CREATE TABLE `follow` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `user_id` int(10) unsigned NOT NULL,
        `follower_id` int(10) unsigned NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';
4

2 に答える 2

7

フォロワーとフォローの両方がuser_idであるため、フィールド名をわずかに変更した2番目のオプション。John が述べたように、次の表の両方の *_user_id フィールドに外部キーを追加します。

さらに、複数形のテーブル名を使用しないでください。「ユーザー」と「フォロー」で十分です。個人的には、「follow」のようなテーブルに「xref_」のような接頭辞を付けて、多対多の関係を可能にする単なる相互参照テーブルであることを好みます (ユーザーは多くのユーザーをフォローでき、ユーザーは多くのユーザーをフォローしている可能性があります)。 )。

'CREATE TABLE `user` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `username` varchar(20) NOT NULL, 
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';

'CREATE TABLE `follow` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `followed_user_id` int(10) unsigned NOT NULL,
        `follower_user_id` int(10) unsigned NOT NULL,
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';
于 2013-02-28T23:38:50.913 に答える
4

最良の方法はどちらでもない。フォロー テーブルとフォロワー テーブルの間に中間テーブルが必要です。中央のテーブルには 2 つの列しかありません。follow_id と follow_id。この種のアプローチでは、言及した 2 つのソリューションの欠点を省略できます。文字列を処理する必要はなく、エントリが重複することもなく、インデックスのみが含まれているパフォーマンスは非常に高速です。

'CREATE TABLE `follow` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';

'CREATE TABLE `user` (
        `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
        `username` varchar(255) unsigned NOT NULL,
        ....
        PRIMARY KEY (`id`)
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1';
'CREATE TABLE `follow_user` (
        `user_id` int(10) unsigned NOT NULL,
        `follower_id` int(10) unsigned NOT NULL,
)

投稿を頻繁に変更するため、フォロワーがユーザーと同じである場合は、2 番目のアプローチの方が優れていると思います。フォローとユーザーのインデックスエクスプレッションのみを保存し、単一のユーザーが何をフォローしているかを確認するための適切な選択クエリのみを保存するため、文字列を解析して検索するよりもはるかに優れています.

于 2013-02-28T23:12:42.823 に答える