1

如果您有以下表格和关系:

  • 产品表
  • 价格点表(产品的一个或多个价格)
  • 版本表(同一区域销售的产品组)

以及在任何给定版本中只能存在一个产品价格的约束。您将如何构建表以反映约束?

为了说明限制,我有一个价格为 1 美元、2 美元和 3 美元的产品。我有 A、B、C、D、E、F、G、H、I 的媒体区(每个都代表像俄亥俄州哥伦布这样的地方)

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 在 A、B、C 中存在时价格为 1 美元,在 A、B、C 中不能有其他价格(2 美元、3 美元)

将版本 M2M 表添加到 PricePoints,然后在 M2M 表上的所有字段减去 PricePoint 字段的唯一索引是否有效?(打字时想了想)有没有更好的方法来表示关系?

4

3 回答 3

2

我在理解你的问题时遇到了一些麻烦。我不理解“产品 A 存在于 A、B、C 中时价格为 1 美元,而不能存在于 D、E、F、G、H、I 中”的说法。为了这个答案,我将假设“版本”和“媒体区”是同一回事。

使用具有三个字段的中间定价表:product_id、version_id 和 price_id。此表的主键(或唯一索引,如果您选择使用增量非智能键)是 (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 回答