gpt4 book ai didi

java - SQL表结构反馈

转载 作者:行者123 更新时间:2023-11-29 03:50:20 26 4
gpt4 key购买 nike

我对下面的 sql 表结构不太满意,原因有两个。

  1. 我不喜欢在 1020 字节的 varchar 变量中列出订单 (orders.itemOrderIds) 中包含的所有项目。我觉得有一种更优雅的方式来保存一堆 ID 号。

  2. 我依赖于从项目表中的 itemDescription 变量中提取关于我的 java 代码中的项目(基本上是字段)的信息。

对于处理这些情况的最佳方式,有人有什么建议吗?我在这个网站上读到,让 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;

最佳答案

是的,您需要一个 OrderItem 交集表(我通常将父对象放在名称的前面),而不是将所有订单 ID 非规范化到一个 varchar 字段中。没有办法正确地为这样的字段建立索引,这使得更新变得非常困难。

继续阅读 database normalization ,这些是您会发现的第一种类型的示例。

关于java - SQL表结构反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9081983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com