我有一个关于在四个表之间实现简单关系的问题。
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 );
知道DB设计的人可以发表意见吗?非常感谢!
答案 0 :(得分:2)
汽车,客户和员工外键的脚本似乎重复了。
约束的名称应包含FK和PK表的名称,例如
fk_sales_client
这样,当数据库架构增长并添加新约束时,它们将不会与其他约束名称冲突。例如。您可能有一名雇员,是客户的负责联系人。使用命名架构,您结束了
具有两个约束,称为employee_id
(对于client->employee
和sales->employee
)。
同一张表中有时存在不止一个同一个PK表的外键,例如在产品表中,您的制造商地址可能带有FK,而供应商地址则带有FK。然后您需要另一种区分约束名称的方法
fk_product_address01
fk_product_address02
或
fk_product_address_man
fk_product_address_sup
如果一个客户每次销售可以购买多于一辆汽车,而这些客户可以是不同型号的汽车,那么您必须重新调整数据库。您需要一个新的连接表sales_item
来实现sales
和automobile
之间的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 );