gpt4 book ai didi

数据库关系问题

转载 作者:搜寻专家 更新时间:2023-10-30 23:17:36 25 4
gpt4 key购买 nike

我对我的数据库设计及其实现有疑问,希望有人能帮助我?

我有一个产品 -> 零售商场景,其中应用以下规则:

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

零售商 - 许多产品

价格可能因零售商而异

所以我有4张 table

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)

即使您已将零售商指定为品牌链接,我仍然可以将与零售商无关的品牌的产品输入到零售商产品表中。我是否遗漏了诸如检查约束之类的内容,或者我的模式是否错误?

谢谢

罗布

*编辑更多详细信息*

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

也许如果我添加以下示例,它会变得清晰。

我有一份我们可以提供的产品设置 list

例如名称描述品牌电视 32 英寸索尼电视 64 英寸索尼电视 20 英寸索尼电视 64 英寸三星电视 32 英寸三星电视 32 英寸松下

零售商Uberhardware - 可以销售所有品牌的电视SonyRetailer - 只允许销售 Sony 产品(所有产品)PanasonicRetailer - 仅限 Panasonic 产品

然后出现了一个我需要设置的新零售商:Phoenix Retail - 不允许销售 Sony 产品

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

编辑 2

我已经实现了建议的备用键设计,但我仍然能够输入不正确的日期,请参阅下面的数据设置和预期结果,但是当我预计有些会失败时,所有输入到零售商产品表中的操作都会成功?

产品
产品 ID 品牌 ID
1 1
2 2

品牌
品牌编号
1
2

零售商
1
2

零售商品牌
零售商 ID 品牌 ID
1 1
2 1
2 2
3 1

零售产品
需要零售 ID 品牌产品 ID1 1 1 好1 2 2 失败2 1 1 确定2 2 2 好3 2 2 失败

最佳答案

  • 备用键 (AK) -- Product 上的唯一约束(带索引)允许从 RetailerProduct 引用 (ProductID, BrandID)作为 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

关于数据库关系问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11141205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com