DBデザイン – 複数のテキストフィールド

私はいくつかの言語で製品とその説明を含むテーブルを持っています。今のところ、テーブルの構造は次のようになります

tblProducts

productId INT PK AI
productDesc_en VARCHAR
productDesc_de VARCHAR
productDesc_it VARCHAR

等々。 enは英語、deはドイツ語

彼の言語設定に従う訪問者は彼の言語に関する記述を見る。

ちょうど不思議ですが、代わりにこのようなデータを格納することに何らかの利点がありますか?

tblProducts

productId INT PK AI

tblProductDesc_en

descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

tblProductDesc_de

descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

tblProductDesc_it

descId INT PK AI
tblProducts_productId INT FK
description VARCHAR

この解決策で私が見るプロ

  1. DBの観点から維持しやすくする
  2. DBレコードからオブジェクトをインスタンス化するときに使用されるメモリが少なくなりました(必須の言語
    オブジェクト内に格納されます)

con(s):

  1. JOINを使用して、パフォーマンスを上回る可能性のある必要なデータを取得する必要があります。
  2. クラス内でより複雑なgetterとsetter

他に何か?

ありがとうございました!

ベストアンサー

私は、新しい言語が追加されたときに、より安定したdbスキーマを提供する、正規化に非常に近い良い解決策になると思う。

それは次のようになります:

CREATE TABLE `language` (
  `prodID`  INT UNSIGNED NOT NULL  ,
  `desc` varchar(30) null  ,
  `lang`  char(2) NOT NULL,
  PRIMARY KEY  (`prodID`,`lang`),
  CONSTRAINT `fk0` FOREIGN KEY (`prodID`)
        REFERENCES `product` (`prodID`)
        ON DELETE CASCADE
) ENGINE=InnoDB ROW_FORMAT=COMPACT;

外部キーは、製品が削除されたときに完全性を提供し、製品が存在する場合にのみ挿入を許可します。

複合主キーでは、言語と商品の説明が1回だけ保存されます。

従属性に関しては、プライマリキーはプライマリキーの両方の部分に依存するため、このプライマリキーはうまく見えます。

プライマリキーと外部キーの一部と同じフィールドを持っています。プライマリキーのこの部分を借りるようなものです。

==========編集1(上記の変更はありません)============== descフィールドで
NullNull
に置き換えます。次に、商品が存在し、説明がない場合、これは利用可能な説明がないことを意味します。上記のnull
descを許可する理由はないというのが私の意見です。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です