8

これは実行可能でしょうか?データベースの 1 つのフィールドに配列を挿入します。

たとえば、タイトルがあり、ID が 1 つだけのタイトルを使用したいのですが、ウェブサイトでバイリンガルで使用される予定です。

グローバル ID を持つ別のテーブルを作成してから、グローバル ID を持つテーブルにリンクされた実際のタイトルを持つ別のテーブルを作成するのは少し不必要だと感じます。

このようなものが欲しいだけです

ID      TITLE
1       Array("english title", "nederlandse titel");

私はPHP/MSYQLを使用しているので、可能であればこれらの言語で説明してください。

そうそう、私はそれをファンキーにフォーマットし、分割関数を使用して再び配列に変換できると考えました。しかし、すぐに配列として保存できるのではないかと思います。ユーザーが同じフォーマット (100 万分の 1) で何かを入力する場合があります。

4

5 に答える 5

15

それは実行可能です:

$title = serialize($array);

そしてデコードします:

$title = unserialize($mysql_data);

しかし、前述のように、そもそもデータベースの利点が実際に減少します。サポートしたい言語の量と、その数が将来変更されるかどうかに応じて、代わりに複数テーブルまたは複数列のオプションを検討することをお勧めします。

編集:dcousineauが言及した良い点(コメントを参照)

シリアル化された出力は、エスケープした後でも、クエリに文字をスローして問題を解決することがあります。serialize() を base64_encode() 呼び出しでラップし、非シリアル化する前に base64_decode() を使用することができます。

これらの状況に合わせて調整されたコード:

$title = base64_encode(serialize($array) );
$title = unserialize(base64_decode($mysql_data) );
于 2008-10-09T01:43:59.567 に答える
6

ここには、実際には 2 つの合理的な選択肢しかありません。

別のテーブルと結合する
長所: 無制限の言語で無制限のタイトルを作成
できる 短所: 結合のオーバーヘッドが計算コストが高くなる、SQL の更新/挿入が若干複雑になる など

複数の列
例: TITLE_EN、TITLE_NL、TITLE_DE
長所: 挿入、選択などの処理が速い
短所: 言語の数が限られている、追加は ALTER TABLE

2 つの選択肢がある場合、通常は最初の選択肢を選択する必要があります。並列化できないわいせつな量のトランザクションを処理している場合や、絶対に言語を追加しないことを絶対に保証できない場合を除き、スキーマ レイアウトの柔軟性が高いため、長期的には頭痛の種から解放されます。

于 2008-10-09T01:39:34.147 に答える
2

配列は正規化に違反します。国際化データベースに関する私の経験では、フレーズを正規化することが最良の設計であることがわかりました。

行の大規模なコピーを簡単に作成できます。たとえば、「es」から「es-mx」または「en」から「en-US」、「en-GB」、および私のお気に入りの「xx-piglatin」です。配列スキーマでは、すべてのレコードを書き直すか、複雑な解析を追加するか、XML などの配列よりも複雑なものを使用する必要があります。

LEFT JOIN仕事で翻訳されていないフレーズを見つけるために sを使用するのは比較的簡単でCOALESCE、フレーズが翻訳されていなくてもプログラムを使用できるようにデフォルトを返すために使用することも比較的簡単です。

于 2008-10-09T01:50:43.373 に答える
1

3 列のテーブルを使用してください。

ID、TITLE_EN、TITLE_NL

それを連載する正当な理由はありません、本当に!

于 2008-10-09T19:01:11.187 に答える