0

我正在设计有 2 个表的 Db

  1. 行项目表
  2. 价格表

每个行项目可以是 Lot 类型,或者 Unit Lot 是具有相同价格的行项目组。所以有许多行项目到一个价格关系,并且有一个单元行项目,每个项目都有不同的价格(所以有一个 - 一个关系)

所以现在,我有 2 个表,它们之间有 2 种关系价格(单位)1 到 1 行项目价格(手)1 到多个行项目

我们开发了如下设计

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

此处类型指示是单位还是批次

但它并不完全限制上述关系

例如:LineItem 表下面有 3 行

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

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

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

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

我尝试创建单独的主表,LineItemType(Id,Type) 因为它只有 2 条记录(1,Unit),并且在多列(2,Lot) 中引用了这个 Id ,但这并没有太大区别,因为属于同一批次的 2 件商品可能有不同的价格。PriceTableLineItemTypeFk

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

4

1 回答 1

1
-- 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

根据下面的评论,保留GRPitem.

-- 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 ;
于 2021-01-06T20:16:53.737 回答