这样的表如何建立主从关系?(100分)

  • 主题发起人 主题发起人 lccc
  • 开始时间 开始时间
L

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
有4个表,分别如下:、
1、客户表 CustTable:CustID, CustName ,.... 。其中CustID为主键。
2、商品表 WareTable:CustID,WareID,WareName,...,Stock(库存)
其中:CustID 为外键,与CustTable构成主从表;CustID+WareID=主键。
CustID+WareName=唯一索引。(由于不同的客户可能有相同的商品,或者不同客户的
不同商品编码可能相同所以不能以 WareID 做主键。同时,预防同一客户同一商品因
编码不同而重复,设置CustID+WareName 为唯一索引。)
3、出入主表 IOITable:IOid,CustID
(出入单号 IOid 为主键, CustID 为外键,与CustTable.CustID构成主从表)
4、出入明细表 DetailTable:IOid(出入单号),WareID,WareName(LookUp字段),
IOCount(出入数量)。
其中,IOid 为外键,与IoTable.IOid构成主从表,IOid+WareID=主键,确保
一张明细表中一种商品只输入一次。

现在的问题是:
1、按理应在 DetailTable 与 WareTable 之间建立主从关系,如何建立。
2、如果不建立两表的主从关系 ,如何不用程序确保不在 DetailTable 中
输入 Waretable 中不存在的商品。
我已经在程序中实现,现在想直接用 SQL 主从方式来保证。请大虾指教。

谢谢
 
WareTable 的设计有问题,由于 WareID 不唯一,所以无法成为主从关系中的主方。
你的设计不符合第三范式,应该对 WareTable 进行关系分解:
建立 WareTable 表,只包含商品信息:WareID,WareName,...,令 WareID 为主键
建立 Cust_Ware 表,表示 Cust 与 Ware 的库存关系:CustID,WareID,...,Stock(库存),其中 CustID,WareID 为外键。
这样,DetailTable 和 WareTable 就可以建立主从关系了。
具体怎样操作就不用说了吧。
From: BaKuBaKu
 
To BaKuBaKu:
你好。外出一段时间,未及时感谢,抱歉!
本程序是用于仓库管理的,故 WareTable 表中的商品有一些特别要求:
1、不同的客户,可能有相同的商品,如:第一百货、家电公司都有
“长虹2921纯平彩电” 存放在本仓库,其商品编码应一致。所以
商品的 CustID,WareID 共同确保了唯一性,指明了商品是谁的。
故以 CustID+WareID来唯一标识一行的。
2、在明细表 DetailTable 中,每张单中每种商品只能填写一次,同
时又要指明是谁的商品,从而能将对应客户的对应商品的库存进
行增减操作。


如果必须修改表结构,请指教如何修改。采用CustID+WareID来生成
一个新字段,对于编程将比较复杂,故不予考虑。


谢谢!请继续指教。
 
看来你还是没有明白我的意思。
这个设计的确不符合第三范式的定义,你的问题就出在 WareTable 的设计上:
商品字典表的主键 WareID 一定要唯一,你的设计是这样的:

WareTable:CustID,WareID,WareName,...,Stock(库存)

其实这个关系可以分解成下面的两个关系:

WareTable: WareID, WareName
Cust_Ware: CustID,WareID,...,Stock(库存) // 这个表定义厂商和商品的库存关系,
// 简单地说就是增加一个库存表
// 而不是把库存数量放到商品字典表中
这样做的原因就是,库存数量并不仅仅依赖于 WareID ,所以不能把库存数量放到商品字典表中。
这样改了以后就是符合范式的设计了,然后你的 DetailTable 还需要加入 Cust_ID 字段,
就是说卖出的商品必须指定卖的是哪个厂商的产品,根据 Cust_ID 和 Ware_ID 去 Cust_Ware 表
中增减数量。
Clear ?
From: BaKuBaKu
 
同意BaKuBaKu的观点:
你的WARETABLE 有数据冗余,如果不太在意可以只在DetailTable 还需要加入 Cust_ID 字段
 
谢谢 BaKuKu指点,也谢谢mataijin的关注。
 

Similar threads

后退
顶部