2

MySQL データベースのレコード内にいくつかのイメージ ID を保存するためのより良い方法は何だと思いますか? 別のライブラリから画像を取得するために使用されるのは、画像 ID だけです。

1#4#7#9#10#12 のようにレコード内の ID を内破しますか、それとも配列をシリアル化して保存するだけですか? 一方を他方の代わりに使用することによるパフォーマンス上の利点はありますか? 安定性優先?

私は常に内破と爆発を使用してきましたが、あまり考えたことはありませんでした。ありがとう。

4

4 に答える 4

7

テーブルを (過度に) 正規化したくなく、ID のリストを格納したいだけの場合は、シンプルなカンマ区切りのリストを使用することをお勧めします。これは、MySQL にはカンマを直接処理できる関数がいくつかあるためです。区切られた文字列値:

FIND_IN_SET: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

SELECT FIND_IN_SET('b','a,b,c,d'); --> 2

CONCAT_WS: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

SELECT CONCAT_WS(',','First name',NULL,'Last Name'); --> 'First name,Last Name'

もちろん、SQL JOIN を実行することはできませんが、それでも役に立ちます。

于 2012-11-02T14:35:51.990 に答える
2

シリアル化または JSON エンコードを優先します。
より柔軟で、たとえば、画像のタイトルやその他の詳細を将来そこに追加できるようになります...

于 2012-11-02T14:32:08.413 に答える
2

私が知る限り、この場合に大きな違いはありませんが、配列を想定しており、何を渡しているかがわからないimplode()ため、少し高速です。serialize()

OPのコメントに基づいて編集:

すべての画像は、タイトルと説明などとともに別のライブラリ テーブルに保存されます。しかし、ええ、私はあなたの主張を理解しています。

その場合は良い考えではないので、複数の ID を 1 つのフィールドにシリアル化します。必要なのは、2 つのテーブル間の *-to-Many 関係です。これは、多値フィールドを表す正しい方法です。

+----------------------+
|  USER                |
+---------+------+-----+
| user_id | name | ... |
+---------+------+-----+

+----------------------+
|  USER_PICTURE        |
+---------+------------+
| user_id | picture_id |
+---------+------------+

+--------------------------+
|  PICTURE                 |
+------------+-------+-----+
| picture_id | title | ... |
+------------+-------+-----+
于 2012-11-02T14:33:11.130 に答える
0

友よ、シリアライゼーションとは、オブジェクトのステータスの文字列表現を取得することです。それが機能したとしても、あなたが望むことをするための最良の方法だとは思いません。json オブジェクトを ID とともに保存することをお勧めします。json オブジェクトはマルチプラットフォームであり、文字列であり、人間が簡単に読み取れるため、良いアプローチだと思います。

于 2012-11-02T14:34:10.303 に答える