簡體   English   中英

SQL表結構反饋

[英]SQL Table Structure Feedback

我對下面的sql表結構不太滿意,這有兩個原因。

  1. 我不喜歡在1020字節的varchar變量中列出Order(orders.itemOrderIds)中包含的所有項目。 我覺得有一種更優雅的方式來保存一堆ID號。

  2. 我依賴於從項目表中的itemDescription變量中提取Java代碼中有關項目(基本上是字段)的信息。

是否有人對處理這些情況的最佳方法有任何建議? 我已經在這個網站上閱讀到,讓Java代碼生成表是可以的。 因此,例如,我的Java代碼將創建一個名為order_(orderId)_items的表,該表將包含orderId中包含在order中的所有項目。 這是解決此問題的最佳方法嗎?

CREATE TABLE IF NOT EXISTS customers
(
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
company VARCHAR(255) NOT NULL,
address1 VARCHAR(255) NOT NULL,
address2 VARCHAR(255),
city VARCHAR(255) NOT NULL,
province_state VARCHAR(255) NOT NULL,
country VARCHAR(255) NOT NULL,
zip VARCHAR(255),
telephone VARCHAR(255),
PRIMARY KEY(id)
) ENGINE = INNODB;

CREATE TABLE IF NOT EXISTS orders
(
id INT AUTO_INCREMENT,
customerId INT NOT NULL,
orderNum VARCHAR(255) NOT NULL,
itemOrderIds VARCHAR(1020) NOT NULL,
regName VARCHAR(255) NOT NULL,
regCompany VARCHAR(255) NOT NULL,
regEmail VARCHAR(255) NOT NULL,
orderTime DATETIME NOT NULL,
FOREIGN KEY(customerId) REFERENCES customers(id),
PRIMARY KEY(id)
) ENGINE = INNODB;

CREATE TABLE IF NOT EXISTS items
(
itemNum VARCHAR(255) UNIQUE,
itemName VARCHAR(255),
itemTypeId SMALLINT NOT NULL,
--itemDescription must hold all information needed to generate license keys in format
-- Field_Name1: Field_Value1, Field_Name2: Field_Value2, .....
-- Field names are platform, version, (choose one: port, voiceName)
itemDescription VARCHAR(1020),
FOREIGN KEY(itemTypeId) REFERENCES item_types(id) ON DELETE CASCADE,
PRIMARY KEY(id)
) ENGINE = INNODB;

CREATE TABLE IF NOT EXISTS item_types
(
id SMALLINT AUTO_INCREMENT,
itemType VARCHAR(255) UNIQUE NOT NULL,
PRIMARY KEY(id)
) ENGINE = INNODB;

CREATE TABLE IF NOT EXISTS item_orders
(
id INT AUTO_INCREMENT,
itemNum VARCHAR(255) NOT NULL,
licenseKey VARCHAR(255) NOT NULL,
FOREIGN KEY(itemNum) REFERENCES items(itemNum),
PRIMARY KEY(id)
) ENGINE = INNODB;

編輯:

CREATE TABLE IF NOT EXISTS Order_Items
(
orderId INT NOT NULL,
itemOrderId INT NOT NULL,
PRIMARY KEY(orderId, itemOrderId)
) ENGINE = INNODB;

是的,您需要一個OrderItem相交表(我通常將父對象放在名稱中),而不是將所有訂單ID規范化為varchar字段。 無法正確索引這樣的字段,這使更新非常困難。

閱讀有關數據庫規范化的內容 ,這些是您會發現的第一批示例。

最好的方法-將所有數據結構至少標准化為3NF。

數據庫規范化

就目前而言-更好地將訂單商品列表存儲在單獨的表中,該表還包含對Orders表的引用。

您需要訂單明細表(而不是聯接表)。 為什么? 因為訂單信息特定於特定日期。 因此,您必須存儲該日期的信息。 因此,訂單詳細信息通常包括商品編號,商品名稱,價格(對價格至關重要(包括價格,您需要在出售訂單時的價格,而不是兩年后的價格)。)以及諸如此類的選項的任何詳細信息如顏色,訂購的物品數量等。在訂購表中,您還需要提供有關運送地址的詳細信息,以及顧客的名字,因為這些顧客的名字也會隨着時間而變化。

我也會打出客戶表。 客戶通常可以具有多個地址,電話號碼和電子郵件,並且每個地址應該是一個單獨的相關表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM