小编Har*_*ley的帖子

使用通常唯一标识行的字段对表进行规范化,但有时为空

如果之前有人问过并回答过这个问题,请原谅我。

我正在粗略地制定一个库存管理系统的架构,将在 PostgreSQL 中实现。我们所有的产品和服务都有一个 SKU。我们的大部分产品来自制造商或分销商,并带有单独的“项目编号”(无论是分销商的目录号、制造商的型号,等等)。然而,并非所有人都有这样的数字。我们有内部制造的小组件,通常没有项目编号。我们的服务没有项目编号。由于这些原因,以下 CREATE TABLE 对我来说很有意义。

场景A:

CREATE TABLE product (
   sku            text PRIMARY KEY,
   name           text UNIQUE NOT NULL, -- alternate key
   price          numeric NOT NULL CHECK (price > 0),
   quantity       numeric NOT NULL CHECK (quantity > 0),
   item_number   text -- hmmm...
);
Run Code Online (Sandbox Code Playgroud)

但是,我对此有两个问题。

  1. 有时(可能有 3% 到 5% 的时间),item_number 实际上等于SKU。也就是说,我的一个供应商特别在他们的产品上贴上了我怀疑不是全球唯一的 SKU,按照他们的项目编号设计。

  2. 无论是否等于 SKU,item_number(如果存在)在几乎所有情况下都足以唯一标识我的小商店域中的产品。

我担心将其标准化为 3NF。如果 item_number 有时为 null,则显然不能将其声明为备用键。但是,从语义上讲,它是一个唯一标识符,在我能想到的每种情况下都存在。那么我上面的表格,其中每个属性在功能上都依赖于非主要属性 item_number每当 item_number 存在时,是否标准化?我想不,但我当然不是专家。我想过做以下事情:

情景B

CREATE TABLE product (
   sku            text PRIMARY KEY REFERENCES …
Run Code Online (Sandbox Code Playgroud)

postgresql normalization database-design

7
推荐指数
1
解决办法
1809
查看次数