哪种表设计最适合 SQL Server 中的规范化?

RGS*_*RGS 3 sql-server sql-server-2016

我在我们的应用程序中有三种不同的产品,即车辆、黄金和财产。每个产品都有近 30 种不同的库存详细信息。我设计了我的表结构如下:-

标题表:-

 PkId ------ + ProductFkId------ + AssetId ------ + RegNo
  1          | 1                 | A00001         | R0001   
  2          | 2                 | A00002         | R0001
  3          | 3                 | A00003         | R0001
Run Code Online (Sandbox Code Playgroud)

车辆库存表:-

 PkId ---------------+ HeaderFkId -------- + Make ------- + Model  
  1                  | 1                   | Toyota       | Etios Cross Dieselvdsp
  2                  | 2                   | Toyoto       | Etios Dieselgd
  3                  | 3                   | Toyota       | Etios Dieseld-4d Gd
Run Code Online (Sandbox Code Playgroud)

黄金库存表:-

  PkId ------- + HeaderFkId ----- + Carat18 ----- + Carat19 ----- + Carat20 ----- + Carat21 ----- + Carat22 ------ + Carat23 ----- + Carat24
   1           | 1                | 10            | 0             | 100           | 45            | 35             | 4             | 7
   2           | 2                | 1             | 100           | 0             | 50            | 40             | 6             | 0
   3           | 3                | 30            | 40            | 10            | 10            | 56             | 0             | 10
Run Code Online (Sandbox Code Playgroud)

财产清单表:-

  PkId ----- + HeaderFkId ----- + MarketPrice ----- + ReservePrice ----- + PropertyDescription
   1         | 1                | 300000            | 200000             | Flat No. 202 & 202-A
   2         | 2                | 500000            | 400000             | Flat No. 201 & 201-A
   3         | 3                | 200000            | 100000             | Flat No. 200 & 200-A
Run Code Online (Sandbox Code Playgroud)

全部放在单表中:-

PkId --- + ProductFkId--- + AssetId --- + RegNo --- + Make --- + Model --- + Carat18 --- + Carat19 --- + Carat20 --- + MarketPrice --- + ReservePrice --- + PropertyDescription
 1       | 1              | A00001      | R0001     | Toyota   | Etios     | Null        |  Null       | Null        | Null            | Null             | Null         
 2       | 2              | A00002      | R0002     | Null     | Null      | 5           |  84         | 56          | Null            | Null             | Null
 3       | 3              | A00003      | R0003     | Null     | Null      | Null        |  Null       | Null        | 46000           | 500000           | Flat
Run Code Online (Sandbox Code Playgroud)

我也可以将产品数据存储在一张表中,而不是将产品数据存储在单独的表中。明天任何新产品都会出现,那时我需要创建新表或基于一个表中的产品添加额外的 10 或 20 列。如果我当时将所有产品详细信息保存在一张表中,但特定产品除外,其他产品列将存储空值。哪种表设计结构最适合规范化?

Vér*_*ace 5

有时沿着EAV 路线走下去是很诱人的(甚至非常诱人),但是sunt leones!这个令人愉快的图像概括了这种方法的困难 - 就像在小学一样,你不能把苹果和橙子混在一起!花一点时间仔细阅读链接,看看 EAV可以引导到哪里。

如果我是你,我会做类似下面的事情。

CREATE TABLE vehicle
(
  vehicle_id INTEGER PRIMARY KEY,
  vechicle_make VARCHAR (50), -- another table?
  vehicle_name VARCHAR (50),
  vehicle_estimated_value INTEGER,
  vehicle_reserve INTEGER
);

CREATE TABLE gold
(
  lot_id INTEGER PRIMARY KEY, -- database generated
  dealer_id INTEGER, -- another table?
  lot_name VARCHAR (30), -- unique/ or unique with dealer
  gold_carat SMALLINT,
  gold_value INTEGER,
  gold_reserve INTEGER
);

CREATE TABLE portfolio
(
  portfolio_id INTEGER, -- database generated  
  pf_asset_type INTEGER, -- FOREIGN KEY from asset_type table
  pf_asset_id,           -- FOREIGN KEY from asset (gold) table

  -- make the combo of pf_asset_type and _id UNIQUE

  pf_asset_value INTEGER,
  pf_asset_reserve INTEGER      

  --  If I were you, I'd be using a TRIGGER to feed values 
  --  from the different asset tables into these two monetary 
  --  fields. Not sure of the exact capabilities of SQL Server,
  --  maybe some sort of non-updateable calculated field? 
  --  The advantage this has is that you're not having a massive 
  --  sum query for all your assets... Test and see what works for you.
);
Run Code Online (Sandbox Code Playgroud)

此架构应该适用于任何服务器(在 PostgreSQL 上测试),但显然,您必须包含 Microsoft SQL Server 的详细信息,以用于 PK 和 FK 约束的自动递增键和语法。

可以根据需要轻松添加其他资产类型!