SQL表结构反馈

时间:2012-01-31 15:17:28

标签: java sql database-design structure

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

  1. 我不喜欢我在一个1020字节的varchar变量中列出Order(orders.itemOrderIds)中包含的所有项目。我觉得有一种更优雅的方式可以容纳一堆身份证号码。

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

  3. 是否有人就处理这些情况的最佳方式提出一些建议。我在这个网站上看过,可以让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;
    

3 个答案:

答案 0 :(得分:3)

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

阅读database normalization,这些是您会发现的第一批首例示例。

答案 1 :(得分:1)

最好的方法是将所有数据结构规范化至少3NF。

Database Normalization

就目前而言 - 在单独的表中更好地存储订单商品列表,该列表也包含对订单表的引用。

答案 2 :(得分:0)

您需要订单明细表(不是连接表)。为什么?因为订单信息特定于特定日期。因此,您必须存储该日期的信息。因此,订单详细信息通常包括商品编号,商品名称,价格(包含价格至关重要,您需要订单销售时的价格而不是2年后的价格。)以及任何选项的详细信息。作为颜色,订购的商品数量等。在订单表中,您还需要包含有关运送到哪个地址的详细信息,以及客户的名称,因为这些符号也会随着时间的推移而变化。

我也打破了客户表。客户通常可以拥有多个地址,电话号码和电子邮件,每个都应该是一个单独的相关表。