0

私は、次のようなテーブルを持つプロジェクトで作業しました。

tbl_texts
id, item_id, item, type, lang, value
1, 44, 'product', 'name', 'en', 'Product Name'
2, 44, 'product', 'description', 'en', 'Product description'
3, 55, 'category', 'name', 'en', 'Category name'
4, 55, 'category', 'name', 'fi', 'Category finnish name'

6 つのフィールドのうち、1 つが主キーで、4 つが複合インデックスでした。主キーでデータが選択されたことはありません。Item_id、item、type、lang インデックスが常に使用されていました。

1)これがデータを保存する良い方法なのか悪い方法なのか疑問に思っていましたか?

2) 2 回参加しなければならないテーブルを持つのは悪い設計ですか (製品の名前と説明が必要な場合)。

3) データを次のようなテーブルに分割する必要があります。

tbl_product_texts
id, product_id, type, lang, value

tbl_category_texts

(etc.)

4) またはこのように:

tbl_product_names
id, product_id, lang, name

tbl_product_descriptions
id, product_id, lang, description

(etc.)

5) または、次のようにします。

tbl_product_names_en
id, product_id, name

tbl_product_descriptions_en
id, product_id, description

(etc.)

これを行うための最も最適な方法はどれか、本当に混乱しています。

4

2 に答える 2

1

データを保存する「最善の」方法は、非常に自由な質問です。データ ストレージのスキーマを設計するときは、複数の側面を考慮する必要があります。

  • データはどのようにアクセスされますか? (クエリの最適化)
  • データはどのように作成されますか?
  • データベース スキーマが将来変更される可能性はどのくらいありますか?

ウィキペディアには、データの正規化に関する優れた記事があります: http://en.wikipedia.org/wiki/Database_normalization

個人的には、基になるデータに基づいて意味のあるテーブルを作成します。製品がカテゴリに対して十分に異なる場合は、それらを異なるテーブルに保存します。データの小さなサンプルしか提供していませんが、各製品には複数の名前と説明があり、言語ごとに 1 つのエントリしかないと仮定します。これにより、次のようになります。

Products:
  PK: id
  ...other columns that each product only has a single value for (price for example)

Product_Texts:
  PK,FK: product_id 
  PK:    language
         name
         description

(PK - 主キー、FK - 外部キー)

名前または説明を検索するクエリがある場合は、必要に応じてそれらのフィールドにさらにキーを追加することを検討できます。

于 2013-10-31T15:07:28.947 に答える
0

これが悪い実装であるかどうかは、それで何をしたいかによって異なります。これは、アイテム、タイプ、および言語のさまざまな組み合わせ用に設計されているようです。唯一目立つのは item 列です。すでに item_id を持っているので、これは必要ないかもしれません。

現在の実装が機能し、パフォーマンスの問題がない場合は、おそらく何も変更する必要はありません。結局のところ、現在の状況を改善するには時間がかかり、重要な問題の修正や新しい機能の構築に費やすほうがよい場合があります。

この設定で問題が発生する場合は、要件を調べる必要があります。たとえば、すべてのアイテムに常に存在する一定量の可能なタイプがあることがわかっている場合、これが解決策になる可能性があります (たとえば、可能なタイプは 2 つだけです)。

tbl_texts
id, item_id, item, lang, name_value, desc_value
1, 44, 'product', 'en', 'Product Name', 'Product description'
3, 55, 'category', 'en', 'Category name', 'Category description'
4, 55, 'category', 'fi', 'Category finnish name', 'Category finnish description'

レコードの量が半分になり、1 つの検索条件が削除され、追加された余分な列が相殺されます。オプションの型が複数あると、この解決策がさらに悪化する可能性が高く、型の数が不明な場合は解決できなくなります。

于 2013-10-31T15:09:31.893 に答える