0

| で区切られたテーブル フィールドにユーザー ID 値を格納しています。(user_id1|user_id2|user_id3|user_id17)。

ユーザー ID は、特定の時点でこのフィールドに追加および削除されます。

現在のユーザー ID がフィールドに存在するかどうか、またはクエリを使用していないかどうかを確認するにはどうすればよいですか? もちろん、完全に一致する必要があります。user_id1を探して見つけることができませんuser_id17

SELECT クエリを使用し、フィールドを展開してから使用できることはわかってin_arrayいますが、クエリを使用してそれを行う方法があれば、より良いでしょう。

4

3 に答える 3

3

トピックをまだ読んでいないユーザー向けのフォーラムに値を保存する (これは悪い考えです) ことは、スケーラブルではありません。新しいユーザーのサインアップ時にデータベース内のすべてのトピックにエントリを追加する必要があることに関連する問題も発生するため、本当に必要な場合は逆に行ってください。

リレーショナル テーブルを前に出す代わりに、次のようにしてみてください

Table: topics
+----+-------+------+-----
| id | title | body | ...
+----+-------+------+-----
| 1  | xyz   | .... | ...

Table: replies
+----+-------+------+-----
| id | title | body | ...
+----+-------+------+-----
| 3  | xyz   | .... | ...

Table: read_topics
+---------+----------+
| user_id | topic_id |
+---------+----------+
| 2       | 1        |

あなたのアプローチは可能ですが(そして想像しやすいですが)、膨大な数のユーザーがいると崩壊し始め、コメントでほのめかしたのはスケーラビリティです。ここでのもう 1 つの問題は、別のトランザクションを行う前に、データベースからデータを取得して分割し、操作して再結合する必要があるため、このアプローチではパフォーマンスが大幅に低下することです。また、テーブルが 2 つの CGI スレッドによって同時に書き込まれるという問題もあります。それを楽しんでください...

データの操作、並べ替え、データの関係、および保存のためにツールを使用しているため、情報のゴミ捨て場としてだけでなく、それらすべてに使用してください。

1. 私はデータベース最適化の完全な専門家ではありませんが、これよりも優れた方法がある可能性が非常に高いです。テスト!

于 2013-03-10T18:54:41.303 に答える
1

この方法で ID を保存するのは悪い考えです。より良い戦略は、この列を別のテーブルにリファクタリングし、そのテーブルに user_id ごとに 1 行を格納することです。

いずれにせよ、常に「|」でコンテンツを開始および終了することにより、列に user_ids を格納する方法を少し変更できる場合は、

たとえば、次のように変更します。

(user_id1|user_id2|user_id3|user_id17)

(|user_id1|user_id2|user_id3|user_id17|)

その後、クエリは簡単になります

SELECT * FROM dbname.tablename WHERE userid_csv LIKE "%|user_id1|%"

これは非常に非効率的であり、テーブルのスイープが発生する可能性があることに注意してください。

于 2013-03-10T17:30:59.880 に答える
0

Postgres arraysに相当する MySQL を探しているようです。あなたが説明した問題に取り組むための合理的な方法であるため、賛成票を投じる必要があります。残念ながら、MySQL が配列型のデータをサポートするまでは、あなたが説明したように、文字列から配列への厄介なプロセスに頼らなければならないかもしれません。MySQLで配列型の値と関係を設定するための他のソリューションについて調査します。また、これが実際に最適化になるかどうか、または交点テーブルを使用したより標準的なソリューションを使用したほうがよいかどうか、予想されるデータの種類を含む大量のデータ セットでテストを行うことも試みます。

データを見ずに頭に浮かぶもう 1 つの考えは、トピック ID とユーザー ID を使用して交差テーブルを作成することですが、トピックが読み取られたときにのみ行を挿入することです。次に、ユーザー/トピックの行がないことは「未読」を示していると想定できます。

于 2013-03-10T18:55:59.537 に答える