Я не очень доволен структурой таблицы sql, которую я имею ниже по двум причинам.SQL Table Structure Feedback
мне не нравится, что я перечисляю все элементы, включенные в Распоряжения (orders.itemOrderIds) в переменной VARCHAR в 1020 байт. Я чувствую, что есть более элегантный способ держать кучу идентификационных номеров.
Я полагаюсь на извлечение информации о предмете (в основном полях) в своем java-коде из переменной 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;
Edit:
CREATE TABLE IF NOT EXISTS Order_Items
(
orderId INT NOT NULL,
itemOrderId INT NOT NULL,
PRIMARY KEY(orderId, itemOrderId)
) ENGINE = INNODB;
Использование 'VARCHAR (255)' для большинства атрибутов вонючее. – onedaywhen
Не могли бы вы рассказать об этом больше? Я начинающий разработчик программного обеспечения (только 1 год опыта), поэтому любой совет будет высоко оценен. – thatidiotguy
Я предполагаю, что значения 'orderNum' не имеют ширины до 255 символов. Вероятно, они не сильно различаются по длине, если вообще. Если значения на самом деле всегда имеют длину 10 символов, тогда будет целесообразно «CHAR (10)»: он указывает пользователям важные свойства данных, и вы получаете максимальную проверку длины «бесплатно», что, на мой взгляд, особенно важно для mySQL потому что в нем отсутствует поддержка ограничений CHECK. Что касается запаха, использование 'VARCHAR (255)' предполагает, что модель данных не была разработана кем-то с конкретным знанием рассматриваемого предприятия. НТН. – onedaywhen