我目前有一個供應商表,現在我想存盤每個供應商服務的區域。
<form method="post" action="/Tests/Post/">
<fieldset>
<legend>What is Your Served Region ?</legend>
<input type="checkbox" name="served_region" value="Europe">Europe<br>
<input type="checkbox" name="served_region" value="Asia">Asia<br>
<input type="checkbox" name="served_region" value="Africa">Africa<br>
<br>
<input type="submit" value="Submit now" />
</fieldset>
</form>
作為第一個想法,我制作了這樣的供應商模型:
CREATE TABLE supliers (
supplier_id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL,
servesAfrica BOOLEAN NOT NULL DEFAULT false,
servesEurope BOOLEAN NOT NULL DEFAULT false,
servesAsia BOOLEAN NOT NULL DEFAULT false
);
這似乎是一個很好的模式?特別是對于按服務區域過濾供應商的查詢等。如果將來我想添加更多區域,這個解決方案是否仍然可靠?
uj5u.com熱心網友回復:
如果將來我想添加更多區域,此解決方案是否仍然可靠?
不,添加另一個區域需要:
- 向資料庫表中添加新列
- 修改您的應用程式代碼以參考該新列
在實時應用程式中更改資料模型和應用程式代碼始終是一個痛點。(確切的痛苦取決于你的改變程序。)
更好的設計是有一個 REGIONS 表和一個 SUPPLIER_REGIONS 交集表。圍繞該結構構建應用程式并添加新區域只是一些插入陳述句的問題。
CREATE TABLE suppliers (
supplier_id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL
);
CREATE TABLE regions (
region_id SERIAL PRIMARY KEY NOT NULL,
region_name VARCHAR(255)
);
CREATE TABLE supplier_regions (
supplier_id SERIAL NOT NULL,
region_id SERIAL PRIMARY KEY NOT NULL,
constraint supplier_regions_pk primary key (supplier_id, region_id),
constraint supplier_regions_supplier_fk foreign key (supplier_id) references suppliers (supplier_id),
constraint supplier_regions_region_fk foreign key (region_id) references regions (region_id)
);
為僅 3 個值創建一個附加表是否最佳:歐洲、非洲和亞洲?
最佳性在旁觀者的眼中。
考慮另一個變化:讓我們將 CUSTOMERS 添加到組合中。我們想知道我們的客戶屬于哪個地區。我們還添加了 WAREHOUSES,并想知道它們位于哪個區域。現在我們想知道:存盤供應商 X 產品的最佳倉庫是哪個?向客戶 Y 交貨的最佳倉庫是哪個?擁有一個 REGIONS 表來連接多個依賴表使得回答這些問題比在物體表上連接標志列容易得多。
您提出的解決方案將可以對區域表進行操作,例如添加更多欄位(翻譯名稱等)
這是一個很好的洞察力。資料建模的目的之一是驅逐領域中的所有核心物體。我們想要存盤多個屬性的東西需要是獨立的表。
uj5u.com熱心網友回復:
我認為您需要像下面這樣更規范化的東西。這樣,您還可以在不更改表架構的情況下添加新區域。在您的示例中,您需要在新區域的情況下添加新列。在下面,您只需要添加新行。
CREATE TABLE regions (
id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255) NOT NULL
);
CREATE TABLE suppliers (
supplier_id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL,
region_id INT NOT NULL,
CONSTRAINT fk_regions
FOREIGN KEY (region_id)
REFERENCES regions(id)
);
如果您正在尋找一個更“分析”的層,即沒有標準化,以下也可以作業,只是您會大量復制“region_name”。
CREATE TABLE suppliers (
supplier_id SERIAL PRIMARY KEY NOT NULL,
name VARCHAR(255),
email VARCHAR(255) UNIQUE NOT NULL,
region_name VARCHAR(255)
);
uj5u.com熱心網友回復:
同意 romborimba,但如果我說得對,您可以將多個區域分配給一個供應商。在這種情況下,我會使用系結表
快速SQL
Binding_tbl
ID
Supplier_ID
ID
NAME
EMAIL
REGION_ID
ID
NAME
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454336.html
上一篇:OracleSQL:計算加權概率
下一篇:SQL通過有兩個專案選擇不同的組
