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 列。如果我当时将所有产品详细信息保存在一张表中,但特定产品除外,其他产品列将存储空值。哪种表设计结构最适合规范化?
有时沿着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 约束的自动递增键和语法。
可以根据需要轻松添加其他资产类型!