4

正規化する必要があるデータベースを作成していますが、対処方法がよくわからない問題に遭遇しました。

問題を説明するために、問題の簡単な例をまとめました。

Item ID___Mass___Procurement__Currency__________Amount
0__________2kg___inherited____null________________null
1_________13kg___bought_______US dollars_________47.20  
2__________5kg___bought_______British Pounds______3.10
3_________11kg___inherited____null________________null   
4__________9kg___bought_______US dollars__________1.32

(見にくい表で申し訳ありません。新規ユーザーは画像の貼り付けを許可されていません)

上の表には、アイテム ID に機能的に依存するプロパティ (Amount) がありますが (私が思うに)、アイテム ID ごとに存在するわけではありません (継承されたアイテムには金銭的コストがないため)。私はデータベースに比較的慣れていませんが、初心者のチュートリアルや文献でこれに類似した問題が見つかりません。どんな助けでも大歓迎です。

4

4 に答える 4

2

2 つの新しいテーブルItemProcurementと を作成するだけCurrenciesです。

私が間違っていなければ、提示されたデータによると、金額はアイテム自体の調達の一部です (アイテムが継承されていない場合)。そのため、新しいエンティティのAmountCurrencyIDフィールドをグループ化しますItemProcurement

ご覧のとおり、継承されたアイテムにはItemProcurementテーブルにエントリがありません。

メインItemテーブルに関しては、調達の種類に 2 つの異なる値が予想される場合は、char(1)列を使用します ( B=> バウグス、I=> 継承とは異なります)。

私は次のようになります:

ここに画像の説明を入力

データは次のようになります。

TABLE Items
+-------+-------+--------------------+
|    ID |  Mass |  ProcurementMethod |
|-------+-------+--------------------+
|     0 |     2 |                  I | 
+-------+-------+--------------------+
|     1 |    13 |                  B | 
+-------+-------+--------------------+
|     2 |     5 |                  B | 
+-------+-------+--------------------+

TABLE ItemProcurement
+--------+-------------+------------+
| ItemID |  CurrencyID |     Amount |
|--------+-------------+------------+
|     1  |         840 |      47.20 | 
+--------+-------------+------------+
|     2  |         826 |       3.10 | 
+--------+-------------+------------+

TABLE Currencies
+------------+---------+-----------------+
| CurrencyID | ISOCode |     Description |
|------------+---------+-----------------+
|        840 |     USD |      US dollars | 
+------------+---------+-----------------+
|        826 |     GBP |  British Pounds | 
+------------+---------+-----------------+
于 2012-10-12T22:55:09.973 に答える
1

だけでなく、これは候補キーのように見えるためAmount、すべてが に依存しています。ItemID

あなたが持っている依存関係はCurrencyAmount(またはNULL@XIVsolutionsによって指摘され、「継承されたアイテムには金銭的コストがない」と述べたように0コスト)Procurement'inherited'

つまり、iem は (調達の) 2 つのタイプに分けられ、2 つのタイプのいずれかのアイテムがすべての属性を持っているわけではありません。

これは、スーパータイプ/サブタイプの分割で解決できます。スーパータイプ テーブル ( Item) と 2 つのサブタイプ テーブル (ItemBoughtおよびItemInherited) があり、それぞれ1::0..1にスーパータイプ テーブルとの関係があります。すべての項目に共通の属性はスーパータイプ テーブルにあり、その他のすべての属性は関連するサブタイプ テーブルにあります。

Item
----------------------------
ItemID    Mass   Procurement
0          2kg   inherited
1         13kg   bought
2          5kg   bought
3         11kg   inherited 
4          9kg   bought

ItemBought
---------------------------------
ItemID    Currency         Amount
1         US dollars       47.20  
2         British Pounds    3.10 
4         US dollars        1.32

ItemInherited
-------------
ItemID
0       
3    

継承されたアイテムのみが持つ属性がない場合は、ItemInheritedテーブルを完全にスキップすることさえできます。

このパターンに関するその他の質問については、タグ Class-Table-Inheritance を参照してください。その際、Shared-Primary-Key も調べてください。より概念的な扱いについては、「ER Specialization」でググってください。

于 2012-10-12T21:55:29.600 に答える
1

なぜ正規化する必要があるのですか?

データの整合性に関する問題がいくつか見られますが、明らかな構造上の問題はありません。

「調達」と値/通貨の存在の有無との間の暗黙の依存関係は注意が必要ですが、キーとは関係がないため、実際には大した問題ではありません。

純粋主義者である場合 (たとえば、これは宿題のため)、継承されたアイテムと購入されたアイテムの 2 種類のアイテムを扱います。これらは同じ種類のものではないため、必要な列のみを使用して、InheritedItem と BoughtItem という 2 つの別個のエンティティとしてモデル化する必要があります。

すべてのアイテムの結合ビューを取得するには (たとえば、総重量を取得するため)、ビューまたは UNION sql クエリを使用します。

データベースのオブジェクト モデルを検討している場合は、共通のスーパータイプ (Item) を除外し、スーパータイプ テーブルへの外部キーを使用してサブタイプ (InheritedItem、BoughtItem) をモデル化できます (以下の ypercube の説明は非常に適切です)。これは非常に複雑で、サブタイプのみをモデル化するよりも将来性がありません。

この最後の点は多くの議論の対象ですが、実際には、私の経験では、データベースで具体的なスーパータイプをモデル化すると、後でそれらを抽象化するよりも多くの苦痛が生じます。わかりました、それはおそらくあなたが望んでいたものを超えています:)。

于 2012-10-13T07:56:27.987 に答える
1

これが私の即興の提案です:

更新: Mass は Db に応じて Float/Decimal/Double になり、Cost はお金を処理するための最適なタイプになります (SQL Server 2008 では "Money" ですが、これらは異なります)。

別の更新: 継承されたアイテムのコストは、ゼロではなく、ゼロであるべきです (実際、税金の形で間接コストが発生することもありますが、余談ですが…)。したがって、コストがゼロであっても、Item テーブルにはコストの値が必要です。null であってはなりません。

ご不明な点がございましたら、お問い合わせください。. .

ここに画像の説明を入力

于 2012-10-12T21:25:58.440 に答える