我不太满意我有两个原因下面的SQL表结构。SQL表结构反馈
我不喜欢,我列出所有的项目包括在一个1020字节的varchar变量订单(orders.itemOrderIds)。我觉得有一个更优雅的方式来保存一堆ID号码。
我依靠从项目表中的itemDescription变量中提取有关项目(基本上是字段)的信息。
有没有人对处理这些情况的最佳方式有一些建议。我已经在这个网站上读过,可以让java代码生成表格。因此,例如我的Java代码将创建一个名为order_(orderId)_items的表,该表将包含orderId中包含的所有项目。这是最好的方式去做这件事吗?
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;
对大多数属性使用'VARCHAR(255)'是很臭的。 – onedaywhen 2012-01-31 15:38:40
你能多说一点吗?我是新手软件开发人员(仅1年的经验),所以任何意见将不胜感激。 – thatidiotguy 2012-01-31 15:46:45
我假设'orderNum'值远不及255个字符。如果有的话,它们的长度可能并不相同。如果这些值实际上总是10个字符,那么'CHAR(10)'是合适的:它向用户指出数据的重要属性,并且你可以免费获得最大长度检查,我认为这对于MySQL来说特别重要因为它不支持'CHECK'约束。至于气味,使用'VARCHAR(255)'表明数据模型不是由具有相关企业特定知识的人设计的。 HTH。 – onedaywhen 2012-02-01 08:25:51