该数据库设计对生产是否多对多正确?

时间:2018-10-21 12:59:44

标签: database oracle

我有一个关于在四个表之间实现简单关系的问题。

Client
Employee
Automobile
Sales

全部创建了它们,但是我只是想确保我没有丢失任何可能损害数据库设计的东西。

sales表是所有其他表之间的中介。这是SQL

CREATE TABLE automobile (
    automobile_id           INTEGER NOT NULL,
    automobile_brand        VARCHAR2(16),
    automobile_model        VARCHAR2(16),
    automobile_year         DATE,
    automobile_color        VARCHAR2(12),
    automobile_kilometers   INTEGER,
    automobile_price        NUMBER
);

ALTER TABLE automobile ADD CONSTRAINT automobile_pk PRIMARY KEY ( automobile_id );

CREATE TABLE client (
    client_id          INTEGER NOT NULL,
    client_name        VARCHAR2(25),
    client_address     VARCHAR2(32),
    client_telephone   VARCHAR2(15)
);

ALTER TABLE client ADD CONSTRAINT client_pk PRIMARY KEY ( client_id );

CREATE TABLE employee (
    employee_id          INTEGER NOT NULL,
    employee_name        VARCHAR2(25),
    employee_position    VARCHAR2(15),
    employee_telephone   VARCHAR2(15)
);

ALTER TABLE employee ADD CONSTRAINT employee_pk PRIMARY KEY ( employee_id );

CREATE TABLE sales (
    sale_id         INTEGER NOT NULL,
    client_id       INTEGER,
    automobile_id   INTEGER,
    employee_id     INTEGER,
    sale_date       DATE
);

ALTER TABLE sales ADD CONSTRAINT sales_pk PRIMARY KEY ( sale_id );

ALTER TABLE sales
    ADD CONSTRAINT automobile_id FOREIGN KEY ( automobile_id )
        REFERENCES automobile ( automobile_id );

ALTER TABLE sales
    ADD CONSTRAINT client_id FOREIGN KEY ( client_id )
        REFERENCES client ( client_id );

ALTER TABLE sales
    ADD CONSTRAINT employee_id FOREIGN KEY ( employee_id )
        REFERENCES employee ( employee_id );

ALTER TABLE sales
    ADD CONSTRAINT automobile_id FOREIGN KEY ( automobile_id )
        REFERENCES automobile ( automobile_id );

ALTER TABLE sales
    ADD CONSTRAINT client_id FOREIGN KEY ( client_id )
        REFERENCES client ( client_id );

ALTER TABLE sales
    ADD CONSTRAINT employee_id FOREIGN KEY ( employee_id )
        REFERENCES employee ( employee_id );

和ER图 enter image description here

知道DB设计的人可以发表意见吗?非常感谢!

2 个答案:

答案 0 :(得分:2)

汽车,客户和员工外键的脚本似乎重复了。

约束的名称应包含FK和PK表的名称,例如

fk_sales_client

这样,当数据库架构增长并添加新约束时,它们将不会与其他约束名称冲突。例如。您可能有一名雇员,是客户的负责联系人。使用命名架构,您结束了 具有两个约束,称为employee_id(对于client->employeesales->employee)。

同一张表中有时存在不止一个同一个PK表的外键,例如在产品表中,您的制造商地址可能带有FK,而供应商地址则带有FK。然后您需要另一种区分约束名称的方法

fk_product_address01
fk_product_address02

fk_product_address_man
fk_product_address_sup

如果一个客户每次销售可以购买多于一辆汽车,而这些客户可以是不同型号的汽车,那么您必须重新调整数据库。您需要一个新的连接表sales_item来实现salesautomobile之间的m对n关系。也许这个新表还将包含一个quantity列。

+------------+     +------------+
|            |     |            |
|  Client    |     |  Employee  |
|            |     |            |
+----+-------+     +---------+--+
     ^                       ^
     |                       |
     |     +--------------+  |         +-------------+
     |     |              o--+         |             |
     +-----o  Sales       |            |  Automobile |
           |              |            |             |
           +----+---------+            +-------+-----+
                ^                              ^
                |                              |
                |        +------------+        |
                |        |            |        |
                +--------o Sales_Item o--------+
                         |            |
                         +------------+

答案 1 :(得分:1)

是的,从您当前的数据库设计来看,每笔交易只能购买一辆汽车

要克服此限制,您可以将销售表一分为二

CREATE TABLE sales (
    sale_id         INTEGER NOT NULL,
    client_id       INTEGER,    
    employee_id     INTEGER,
    sale_date       DATE
);

CREATE TABLE sale_items(
    item_id         INTEGER NOT NULL,
    sale_id         INTEGER NOT NULL,   
    automobile_id   INTEGER NOT NULL,   
);

在这里item_id可以是自动生成的,也可以是每个SALE的序列号

如果您决定自动生成item_id,则可以在sale_items上使用主键

ALTER TABLE sale_items ADD CONSTRAINT sale_items_pk PRIMARY KEY ( item_id );

如果item_id仅在每次销售中唯一,则

ALTER TABLE sale_items ADD CONSTRAINT sale_items_pk PRIMARY KEY ( sale_id, item_id );