同一张表之间的一对一和一对多关系

问题描述

我正在设计数据库,其中有 2 个表

  1. 行项目表
  2. 价目表

每个订单项的类型可以是批次或单位 批次是一组具有相同价格的订单项。因此,一种价格关系有许多行项目 并且有单位行项目,其中每个项目都有不同的价格(因此有一对一的关系)

所以现在,我有 2 个表,它们之间有 2 种关系 price(unit) 1 to 1 Line Item 价格(手数) 1 到多行项目

我们开发了如下设计

LineItemTable(Id,PriceIdfk...)Price(Id,Type,CostPrice)

这里输入的是Unit还是Lot

但它并没有完全限制上述关系

例如:LineItem 表下面有 3 行

(1,LotA,31)
(2,31)
(3,Unit,32)

和价格表将有以下 2 条记录

(31,Lot,100$)
(32,13$)

想象一下,将 Line Item 上的 PriceIdFk 从 31 更改为 32,因此属于同一批次的 2 个项目将具有不同的价格,这是不应该发生的。

我尝试将单独的主表创建为 LineItemType(Id,Type) 它将只有 2 条记录 (1,Unit)(2,Lot) 并让 PriceTable 中的此 ID 多出一列 LineItemTypeFk,但这并没有太大区别,因为属于同一批次的 2 件商品可能具有不同的价格。

我想我以错误的方式识别实体,但我找不到适合这种情况的任何解决方案。

解决方法

-- Item ITM is priced at PRI dollars.
--
item {ITM,PRI}
  PK {ITM}
-- All items in group GRP
-- are priced at PRG dollars.
--
_group {GRP,PRG}
    PK {GRP}
-- Item ITM is member of group GRP.
--
item_group {ITM,GRP}
        PK {ITM}

FK1 {ITM} REFERENCES  item  {ITM}
FK2 {GRP} REFERENCES _group {GRP}

如果一个项目是组的成员, 那么团体价格适用;否则适用商品价格。

-- Item ITM is priced at PRICE dollars.
--
CREATE VIEW item_price
AS
SELECT i.ITM,coalesce (g.PRG,i.PRI) AS PRICE
FROM       item       AS i
LEFT JOIN  item_group AS x ON x.ITM = i.ITM
LEFT JOIN _group      AS g ON g.GRP = x.GRP ;

注意事项

All attributes (columns) NOT NULL

PK = Primary Key
FK = Foreign Key

选项 2

根据下面的评论,将 GRP 保留在 item 中。

-- All items in group GRP
-- are priced at group-price of PRG dollars.
--
_group {GRP,PRG}
    PK {GRP}

-- Sample data
--
(GRP,PRG)
----------
(G00,-1)  -- special group,individual item price applies
(G01,120)
(G02,150)
-- Item ITM,from group GRP,is priced at 
-- individual item price of PRI dollars.
--
item {ITM,GRP,PRI}
  PK {ITM}

如果商品是 G00 组的成员,则适用商品价格,否则适用群组价格。

-- Item ITM is priced at PRICE dollars.
--
CREATE VIEW item_price
AS
SELECT i.ITM,CASE WHEN i.GRP = 'G00' THEN i.PRI
                               ELSE g.PRG
       END  AS PRICE
FROM  item  AS i
JOIN _group AS g ON g.GRP = i.GRP ;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...