MySQLユーザーがファンテーブルの設計案に注目することについて考える
4508 ワード
シナリオ1 follow(関心関係表) フィールド名
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
normal
ユーザー
followed_user
integer()->unsigned()->notNull()
注目する人のid
status
smallInteger()->unsigned()->defaultValue(1)
注目状態:注目を取り消すかどうかなど
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
ユーザーが関心を持つたびに、テーブルにデータが追加されます.
メリット:
1.設計が簡単で、検索が便利である.注目する一人一人を区別して特殊な処理(例えば、異なる人の注目イベント、互いに粉を塗っているかどうか、特に注目しているかどうかなど)を行うことができ、3.コードを書きやすい.
欠点:
ユーザ量が大きいとテーブルデータ量が膨大になるため,ユーザを複数のテーブルに分散させるために水平分割テーブルを用いる必要がある.
例えば、10万人のユーザがいて、IDが1~10000のユーザが表1(follow_1)に、IDが10001~20000のユーザが表2(follow_2)に、このようにしている.
しかし、表を分けるともう一つの問題に直面し、注目される人が複数の表に基づいて自分のファンを調べるのは面倒だ.ファンテーブルを再構築する必要がありますファン(ファンリスト) フィールド名
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
normal
ユーザー
follower
integer()->unsigned()->notNull()
ファン人
status
smallInteger()->unsigned()->defaultValue(1)
注目状態:注目を取り消すかどうかなど
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
このデータテーブルは依然として水平テーブル処理が必要です.
シナリオ2 follow(関心関係表) フィールド名
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
ユニーク
ユーザー
followed_user
text
注目する人
follower
text
ファン人
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
各ユーザーが注目している人とファンをjson形式で記録する
メリット:
1.ユーザーごとに1つのレコードしかありません.簡単な検索
欠点:
1.ファンの数や関心が大きすぎる場合、followed_userフィールドとfollowerフィールドのデータ長は非常に大きく、ユーザーが注目している人やファン数が10万人に達すると、1つのデータのデータ量がメガレベルに達し、mysqlのクエリーとphpデータ処理の効率を大幅に低下させます.
2.このテーブルを使用するたびに、データ全体を取り出して計算し、リソースの消費量がかかりすぎます.
シナリオ3
redisを使用したHashデータ型
Redis hashはstringタイプのfieldとvalueのマッピングテーブルです.Redis内の各hashは、232−1キー値対(40億以上)を記憶することができる.
各ユーザはhashテーブルを1枚分け、テーブル名はユーザid(接頭辞または接尾辞を付けることができる)
ユーザが一人に注目するたびにhashテーブルにデータを追加する user_1
field
value
2
1483423443
3
1483423445
13
1483423440
...
... user_2
field
value
1
1483423443
5
1483423445
10
1483423440
...
...
......
メリット
1.クエリーの処理速度が速い.
欠点
1.サーバメモリとCPUを消費する.Redisを実行するには、個別のサーバを使用することが望ましい
2.データ・クエリーは、リレーショナル・データベースほど柔軟ではありません.
3.開発手順が複雑で、学習コストが高い.
ブラックアウト/ファン/注目、データベースに保存されているのはマッピング関係の数字です.例えば、ブラックアウトは1で、ファン/注目は1つのもので、2です.では、記録の重要なデータは次のとおりです. を開始したかを記録します. ですか シーンの例:
ユーザAは、ユーザBに注目する
データの挿入:
ユーザーAのファン数:
ブラックリストは同じだ.
これはあなたが与えた表に従って処理されます.私自身がデザインをしていたとき、実は注目/ファンに時計を作って、ブラックリストにまた時計を作ったのです.自分のニーズや習慣に従えばいいので、どちらを選ぶかは関係ありません.
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
normal
ユーザー
followed_user
integer()->unsigned()->notNull()
注目する人のid
status
smallInteger()->unsigned()->defaultValue(1)
注目状態:注目を取り消すかどうかなど
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
ユーザーが関心を持つたびに、テーブルにデータが追加されます.
メリット:
1.設計が簡単で、検索が便利である.注目する一人一人を区別して特殊な処理(例えば、異なる人の注目イベント、互いに粉を塗っているかどうか、特に注目しているかどうかなど)を行うことができ、3.コードを書きやすい.
欠点:
ユーザ量が大きいとテーブルデータ量が膨大になるため,ユーザを複数のテーブルに分散させるために水平分割テーブルを用いる必要がある.
例えば、10万人のユーザがいて、IDが1~10000のユーザが表1(follow_1)に、IDが10001~20000のユーザが表2(follow_2)に、このようにしている.
しかし、表を分けるともう一つの問題に直面し、注目される人が複数の表に基づいて自分のファンを調べるのは面倒だ.ファンテーブルを再構築する必要があります
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
normal
ユーザー
follower
integer()->unsigned()->notNull()
ファン人
status
smallInteger()->unsigned()->defaultValue(1)
注目状態:注目を取り消すかどうかなど
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
このデータテーブルは依然として水平テーブル処理が必要です.
シナリオ2
を選択します.
索引
注釈
id
primaryKey()
user_id
integer()->unsigned()->notNull()
ユニーク
ユーザー
followed_user
text
注目する人
follower
text
ファン人
created_at
integer()->unsigned()->notNull()
normal
updated_at
integer()->unsigned()->notNull()
normal
各ユーザーが注目している人とファンをjson形式で記録する
メリット:
1.ユーザーごとに1つのレコードしかありません.簡単な検索
欠点:
1.ファンの数や関心が大きすぎる場合、followed_userフィールドとfollowerフィールドのデータ長は非常に大きく、ユーザーが注目している人やファン数が10万人に達すると、1つのデータのデータ量がメガレベルに達し、mysqlのクエリーとphpデータ処理の効率を大幅に低下させます.
2.このテーブルを使用するたびに、データ全体を取り出して計算し、リソースの消費量がかかりすぎます.
シナリオ3
redisを使用したHashデータ型
Redis hashはstringタイプのfieldとvalueのマッピングテーブルです.Redis内の各hashは、232−1キー値対(40億以上)を記憶することができる.
各ユーザはhashテーブルを1枚分け、テーブル名はユーザid(接頭辞または接尾辞を付けることができる)
ユーザが一人に注目するたびにhashテーブルにデータを追加する
field: id
value:
field
value
2
1483423443
3
1483423445
13
1483423440
...
...
field
value
1
1483423443
5
1483423445
10
1483423440
...
...
......
メリット
1.クエリーの処理速度が速い.
欠点
1.サーバメモリとCPUを消費する.Redisを実行するには、個別のサーバを使用することが望ましい
2.データ・クエリーは、リレーショナル・データベースほど柔軟ではありません.
3.開発手順が複雑で、学習コストが高い.
CREATE TABLE relation (
id PRIMARY KEY AUTO_INCREMENT, // ,
from_user_id big integer, // A id
to_user_id big integer,// B Id
rel_type enum(1,2) //
);
ブラックアウト/ファン/注目、データベースに保存されているのはマッピング関係の数字です.例えば、ブラックアウトは1で、ファン/注目は1つのもので、2です.では、記録の重要なデータは次のとおりです.
from_user_id
//このレコードはどのユーザーがto_user_id
//本条記録の受付先はどのユーザーrel_type
//発起者が受け入れ者に対して、何をしましたか?保存タイプユーザAは、ユーザBに注目する
データの挿入:
INSERT INTO relation (rel_type, from_user_id, to_user_id) VALUES(2, A.id, B.id)
ユーザーAのファン数:
select COUNT(*) from relation
where rel_type=2 and to_user_id=A.id;
ブラックリストは同じだ.
これはあなたが与えた表に従って処理されます.私自身がデザインをしていたとき、実は注目/ファンに時計を作って、ブラックリストにまた時計を作ったのです.自分のニーズや習慣に従えばいいので、どちらを選ぶかは関係ありません.