私は現在、PHP/MySQLレーティングシステムを開発中です。ユーザーがログインする必要があることをユーザーが評価できるようにするために、各ユーザーには一意の「UID」があります。ウェブサイトには複数の格付けインスタンスがあります(私の場合はすべてのゲームに1つずつ)、私はMySQLの行にUIDのリストを格納する効率的な方法が必要です(格付けシステムの各インスタンス)投票した人の集計を保持する。ユーザIDのリストを保存するための最良の方法
他のシステムでは、リストがシリアル化されたPHP配列に格納されています。ユーザーが投票するたびに、シリアライズされた配列が抽出され、シリアル化されず、新しいUIDが挿入され、配列が再シリアル化され、MySQL行がUPDATEされます。ページがロードされるたびに、そのリストを再度シリアル化してチェックして、ページを閲覧しているユーザーがまだ投票していないかどうかを確認する必要があります。
これは非効率的で面倒なようです。このプロセスをより効率的にするために、MySQLにリスト機能が組み込まれていますか?この問題を解決するためのもっと巧妙な方法はありますか?
私は、シリアライズを忘れて、UIDをMySQLデータベースのTEXT型フィールドに格納する可能性のある代替案を検討しました。私はちょうど各UIDの後にいくつかの非数字の文字を追加します(ピリオド[。])。ユーザーエントリを追加するには、UIDをTEXTフィールドの最後に連結し、次にピリオドを連結します。ユーザーがすでに投票しているかどうかを確認するときに、私はちょうど "* FROM table WHERE votes = '%$ UID。%';"というように選択できます。これはより効率的に機能するのでしょうか、それとも仕事を効率的にする方法がありますか?テーブル構造について
フォローアップのポスト...正規化されたデータベースでEfficient MySQL table structure for rating system
あなたとメードラードは同じアプローチを提案しているようです。私はこのようにします。私の懸念は、VOTESテーブルのサイズです。おそらく、そのテーブルに<#games x#users>の投票権があると考えられます。それは私の共有ホスティングプランの管理者を恐れさせるべきでしょうか? –
現実的には、「パーティション化」(基本的にデータの分割)を考慮する必要がある前に、テーブルサイズが何百万ものものになっている必要があります。配列を暗黙に埋めるアプローチは行を持ちますが、読み取りと書き込みの両方でかなり高いオーバーヘッドがあります。 – cletus
上記のクエリを実行している場合は、* uidとgidの両方でテーブルのインデックスを作成して、クエリを高速化してください。これは、このアプローチの最大のペナルティです。複数のインデックスが必要です。 – slacy