1

次のテーブルとリレーションがある場合:

  • 製品テーブル
  • Price Point テーブル (製品の 1 つ以上の価格)
  • バージョン テーブル (同じエリアで販売されている製品のグループ)

特定のバージョンには 1 つの製品価格しか存在できないという制約。制約を反映するテーブルをどのように作成しますか?

制限を説明するために、1 ドル、2 ドル、3 ドルの価格の製品があるとします。A、B、C、D、E、F、G、H、I のメディア ゾーンがあります (それぞれコロンブス OH のような場所を表します)。

product A price $1 goes to A, B, C
product A price $2 goes to D, E, F
product A price $3 goes to G, H, I

A、B、C に存在する場合の製品 A の価格 $1 は、A、B、C に他の価格 ($2、$3) を持つことはできません

バージョン M2M テーブルを PricePoints に変換し、M2M テーブルのすべてのフィールドから PricePoint フィールドを除いた一意のインデックスを作成しますか? (これを入力しながら考えました) 関係を表現するためのより良い方法はありますか?

4

3 に答える 3

2

あなたの質問を理解するのに少し苦労しています。「A、B、Cに存在する場合の製品Aの価格$ 1は、D、E、F、G、H、Iには存在できない」という記述がわかりません。この答えのために、「バージョン」と「メディアゾーン」は同じものであると仮定します。

product_id、version_id、price_idの3つのフィールドを持つ中間価格表を使用します。このテーブルの主キー(または、増分非インテリジェントキーを使用することを選択した場合は一意のインデックス)は(product_id、version_id)です。

于 2010-10-21T02:27:16.200 に答える
1

提供されたデータに基づいて、制約を反映するようにテーブルを作成する方法は次のとおりです。

SQL DDL:

CREATE TABLE Products
(
 product_name CHAR(1) NOT NULL UNIQUE
);

CREATE TABLE ProductPrices
(
 product_name CHAR(1) NOT NULL
    REFERENCES Products (product_name), 
 product_price DECIMAL(19, 4) NOT NULL
    CHECK (product_price > 0), 
 UNIQUE (product_name,  product_price)
);

CREATE TABLE MediaZones
(
 zone_name CHAR(1) NOT NULL UNIQUE
);

CREATE TABLE Versions
(
 product_name CHAR(1) NOT NULL, 
 product_price DECIMAL(19, 4) NOT NULL, 
 FOREIGN KEY (product_name,  product_price)
    REFERENCES ProductPrices (product_name,  product_price), 
 zone_name CHAR(1) NOT NULL 
    REFERENCES MediaZones (zone_name), 
 UNIQUE (product_name, zone_name)
);

SQL DML (成功 = 良好):

INSERT INTO Products (product_name) VALUES ('A');

INSERT INTO MediaZones (zone_name) 
   VALUES ('A'), ('B'), ('C'), 
          ('D'), ('E'), ('F'), 
          ('G'), ('H'), ('I');


INSERT INTO ProductPrices (product_name, product_price) 
   VALUES ('A', 1),
          ('A', 2), 
          ('A', 3);

SQL DML (失敗 = 良い):

INSERT INTO Versions (product_name, product_price, zone_name) 
   VALUES ('A', 1, 'G');

INSERT INTO Versions (product_name, product_price, zone_name) 
   VALUES ('A', 1, 'A');

INSERT INTO Versions (product_name, product_price, zone_name) 
   VALUES ('A', 1, 'Z');
 INTO Versions (product_name, product_price, zone_name) 
   VALUES ('A', 2, 'A');

etc etc 
于 2010-10-21T12:57:11.737 に答える
0

製品と価格の組み合わせが特定の地域でのみ許可されていると断言できない場合は、データ制約を放棄し、ストアド プロシージャまたは他のビジネス レイヤーでビジネス ルール制約を使用して、試行する前にどのようなデータが存在するかを確認することをお勧めします。製品、価格、地域の組み合わせをデータベースに追加します。

于 2010-10-21T02:44:38.530 に答える