2011-08-08 15 views
4

私は、mysqlのテキストフィールドにJSON文字列として配列を格納するのがよいかどうか疑問に思っていました。PHP/MySQL - 配列データをJSONとして格納するのは悪い習慣ですか?

私は、ユーザーが請求書に無制限の数の製品を追加できるようにする請求書を作成しています。フォームが提出されると、すべての空白のアイテムなどが取り出されますが、通常は2〜5個のアイテムが残されます。各項目には、SKU、価格、名前、および説明があります。このような状況のため

私のオプションは、(1)、新製品のテーブルを作成するには、新しい行として各項目を追加し、請求書テーブルでそれをリンクし、データにアクセスするとき、両方のテーブルを呼び出すことです。または(2)すべての商品データを単一のJSONテキストフィールドとして請求書テーブルに保存してから、別のテーブルを作成またはアクセスしていません。

私はMySQLのプログラミングにはかなり剛性思いますので、私は、MySQLでJSONを使用すると、ひんしゅくを買うことになるという感覚を得ます。私は正しい?誰かがこれにいくつかの光を当てることができますか?

答えて

13

あなたが必要とするすべてはただのある場合 - それは悪い習慣ではありません。あなたはソートや似たような、処理の任意の並べ替えを実行する必要がある場合

は、しかし - あなたはそれを正規化する必要があります。

+0

驚くべき、答えに感謝します。これは実際には今実際完璧な意味を持ち、製品ごとに検索/並べ替えができるようになるまで、私は大丈夫と思う。 – Tim

+0

データベースロジックの実装を開始した場合は、何か問題があります。それは私の経験則であり、SQLデータベースを使って作業するときです。 – tjameson

+0

これはいつでもいいと思う。あなたは基本的に正しいと言いますが、このような製品を保存しているときは、どの注文にskxxxxがあるのか​​を知りたがっています。または、注文に製品ラインを簡単に追加しようとします。本当に何かをする。 id、orderid、sku、price、name、descripitonフィールドを持つ、order-per-orderを持つテーブルを追加するのは本当に難しいことではありません。たぶんもっと後で。私はそれをしない理由は何も見ません。このテーブルに参加していないと、パフォーマンスの問題が発生します。 – Nanne

0

私はMySQLの専門家ではありませんが、あなたが達成したいことに依存していると思います。請求書に保存した商品を検索可能にしますか?もしそうなら、あなたはリレーショナルデータベース構造を使うのが良いでしょう。

あなたが検索する必要がない場合は、JSON文字列として、あるいは単にシリアル化された配列としてデータを保存し、すべてでJSONを使用してから自分を救うことができます。

あなたのニーズに本当にかかっています。

0

JSONに格納すると、SQLを使用してそれを照会することはできません。たとえば、商品Aの3つ以上を購入した請求書をすべて見つけることができません。

5

他の人があなたの質問にもっと直接的に答えてくれたので、代わりにの保守性をアドレスします。

JSONのようにデータベースエンティティ(SKU、Price、Name、Description)であることを要求している可変個数のアイテムを保存すると大丈夫ですが、大量のデータが重複してしまいます。

代わりに、あなたが言ったことをして、すべての製品のテーブルを作成します。次に、invoices_have_productsの別のテーブルを作成します。次に、請求書IDが一致するinvoices_have_productsのすべての行を引き出し、からすべての行を引き出します。ここで、プロダクトIDは、引っ張った行と一致します(invoices_have_products)。

それは今少し退屈かもしれませんが、すべてのデータがきちんとテーブルと簡単に照会可能であるとき、あなたはずっと幸せになるでしょう。数百万のテキストフィールドに関するレポートをJSONで実行するという悪夢を考えてみましょう。絶対に恐ろしい。

あなたの質問の一部に答えるために:いいえ、私はこれは良い習慣であり、それは正直に言うと、少し悪い習慣のように見えるとは思いません。

関連する問題