数据库关系问题

时间:2012-06-21 15:11:36

标签: database database-design

我有一个关于我的数据库设计及其实现的问题,我希望有人可以帮助我吗?

我有一个产品 - >符合以下规则的零售商场景:

产品 - 许多零售商 产品 - 1个品牌

零售商 - 许多产品

每个零售商的价格可能会发生变化

所以我有4张桌子

product - (Product_ID), product name, brand_ID(FK), details
brand - (Brand_ID), brand name
retailer - (Retailer_ID), retailer_Name, Retailer_Telephone
Retailer_Product - (Product_ID, Retailer_ID), cost,

这很好,因为您可以将产品与转换商联系起来,而不是所有零售商都提供所有产品等。每个产品都有一个品牌。

我的问题基于品牌:

零售商可以提供1个或更多品牌但不一定是所有品牌?我正在实现这个问题吗?

所以我创建了一个Retailer_Brand表

retailer_brand - (retailer_Id, Brand_ID)

即使您已将零售商指定为品牌链接,我仍然可以将产品输入零售商产品表中,该产品表是与零售商无关的品牌。我错过了检查约束或者我的架构错了吗?

由于

罗布

* 编辑更多细节*

我仍然不确定它是否能满足我的要求。

也许如果我添加以下示例,它将澄清。

我有一个我们可以提供的产品设置列表

e.g。 姓名Desc Brand 电视32英寸索尼 电视64英寸索尼 电视20英寸索尼 电视64英寸三星 电视32英寸三星 电视32英寸松下

零售商 优步硬件 - 可以销售所有品牌的电视 SonyRetailer - 仅允许销售索尼产品(所有产品) PanasonicRetailer - 仅限Panasonic产品

然后我需要设置一个新的零售商: 凤凰零售 - 不允许销售索尼产品

我希望能够轻松限制/启用每个零售商的不同品牌?

编辑2

我已经实施了建议的备用密钥设计,但我仍然能够输入错误的日期,请参阅下面的数据设置和预期的结果,但是当我预计某些设备失败时,所有对零售商产品表的参与都会成功吗?

产品
ProductID BrandID
1 1
2 2

品牌
BrandID
1
2

Reatiler
1
2

RetailerBrand
RetailerID BrandID
1 1
2 1
2 2
3 1

RetailerProduct
RetaileID Brand ProductID预期 1 1 1好的 1 2 2失败 2 1 1好的 2 2 2好的 3 2 2失败

4 个答案:

答案 0 :(得分:1)

让我看看我是否做对了。

<强>产品

product_id
name
description
etc

<强>品牌

brand_id
name
etc

<强>零售商

retailer_id
name
etc

关系表 的 brand_prod_ret

retailer_id
product_id
brand_id
price
etc

例如,Uberhardware零售商销售电视:LG,索尼,三星等。

Uberhardware 进入零售商

电视会进入产品

您在 brand_prod_ret 表格中 product_id retaililer_id brand_id 相匹配。

进入品牌,您拥有LG,索尼,三星等

并进入brand_prod_ret,你有

TVs' ID - Sony's id -Uberhardware id
TVs' ID - Samsung's id - Uberhardware id
TVs' ID - LG's id - Uberhardware id

当然还有每个价格。

enter image description here

现在您可以准确了解零售商目前正在销售的品牌

答案 1 :(得分:1)

  • 备用密钥(AK) - Product上的唯一约束(带索引)允许(ProductID, BrandID)RetailerProduct引用为FK。

enter image description here

create table Product (
  ProductID integer not null
, BrandID   integer not null
);
alter table Product add constraint pk_product primary key (ProductID);
alter table Product add constraint un_product unique (ProductID, BrandID);

create table Brand (
  BrandID integer not null
);
alter table Brand add constraint pk_brand primary key (BrandID);

create table Retailer (
  RetailerID integer not null
);
alter table Retailer add constraint pk_retailer primary key (RetailerID);

create table RetailerBrand (
  RetailerID integer not null
, BrandID    integer not null
);
alter table RetailerBrand add constraint pk_retbra primary key (RetailerID, BrandID);


create table RetailerProduct (
  RetailerID integer not null
, ProductID  integer not null
, BrandID    integer not null
);
alter table RetailerProduct add constraint pk_retprd  primary key (RetailerID, ProductID, BrandID);

alter table RetailerProduct add constraint fk1_retprd
      foreign key (ProductID, BrandID) references Product (ProductID, BrandID);

alter table RetailerProduct add constraint fk2_retprd
      foreign key (RetailerID, BrandID) references RetailerBrand (RetailerID, BrandID);

修改

插入一些数据

insert into Brand    (BrandID)                   values (1)  , (2);
insert into Product  (ProductID, BrandID)        values (1,1), (2,2);
insert into Retailer (RetailerID)                values (1)  , (2);
insert into RetailerBrand (RetailerID, BrandID)  values (1,1), (2,1), (2,2), (3,1);

测试

insert into RetailerProduct (RetailerID, BrandID, ProductID) values (1,1,1); -- OK

insert into RetailerProduct (RetailerID, BrandID, ProductID) values (1,2,2); -- FAIL

insert into RetailerProduct (RetailerID, BrandID, ProductID) values (2,1,1); -- OK

insert into RetailerProduct (RetailerID, BrandID, ProductID) values (2,2,2); -- OK

insert into RetailerProduct (RetailerID, BrandID, ProductID) values (3,2,2); -- FAIL

答案 2 :(得分:0)

这个容量是否需要品牌表?

我们有许多关系 产品 - 品牌 零售商 - retailer_product 品牌 - 零售商品牌

似乎您可以将品牌信息保存在retailer_product表中。然后输入的每个新品牌都可以链接到pk。或者只有零售商品牌查询表以强制执行零售商协会的约束b / f可以输入新的零售商产品

答案 3 :(得分:0)

IMO在您当前的结构中,表零售商_brand并非绝对必要,因为您可以通过浏览零售商_产品=&gt;来确定零售商完全或部分库存哪些品牌。 product =&gt;品牌关系。

我是否可以要求您对业务领域进行一些可能会影响数据建模的说明? (我在零售商处有一些经验),例如

品牌通常是零售商特定的(即供应商生产一系列纯粹为一个零售商品牌的产品)。您可以考虑将“供应商”表添加到模型中。

零售商链中的商店通常不会存储所有产品。您可能需要在模型中考虑这一点。

我不确定您是否面向业务的消费者或供应商,但您可能需要对成本价格和销售价格进行建模。

价格应包括日期自/日期