我有一个主键为typ_id的表fahrzeugtyp。在该表中,存储了车辆的类型。另一个表是 ausstattung,其主键 ausstattungs_id 存储用户可以为汽车选择的设备类型。它们具有 m:n 关系,因为每种类型的车辆都有多种类型的设备,反之亦然。连接表被命名为typ-eq并使用它们的主键作为外键。现在我有一个“预订”表,其中存储正在使用 user_id 作为用户表中的外键进行预订的用户。现在我的问题是,我需要添加用户选择的汽车类型和设备,但是当我尝试使用typ-eq的PK作为FK 在预订表中。
如何才能将所有信息存储在一个预订行中?
我是这么理解你说的;这是 Oracle 语法,但没关系,它与本次讨论无关。模型被简化,仅包含主/外键列。
首先琐碎表:
SQL> create table fahrzeugtyp
2 (typ_id number primary key);
Table created.
SQL> create table ausstattung
2 (ausstattungs_id number primary key);
Table created.
SQL> create table users
2 (user_id number primary key);
Table created.
SQL> create table booking
2 (booking_id number primary key,
3 user_id number constraint fk_bu references users
4 );
Table created.
现在,似乎令您烦恼的桌子:
typ_eq
。它应该结合以前表格中的信息:fahrzeugtyp
、ausstattung
和booking
(其中这三个的组合必须是唯一的):
SQL> create table typ_eq
2 (booking_id number constraint fk_tb references booking,
3 typ_id number constraint fk_tf references fahrzeugtyp,
4 ausstattungs_id number constraint fk_ta references ausstattung,
5 --
6 constraint uk_te unique (booking_id, typ_id, ausstattungs_id)
7 );
Table created.
SQL>
你说:
如何才能将所有信息存储在一个预订行中?
这是完全错误的(除非您使用的数据库支持嵌套表,但它们通常使用和维护起来很棘手)。如果您计划将booking行“扩展”到很多很多列,以支持很多很多车辆及其设备(这样它 - 表格 - 看起来像 Excel 电子表格),不 - 不要这样做,这不是你应该采取的方式。因为,迟早您会错过另一列(因此您必须更改表才能添加它),并且您编写的所有查询维护起来将是一场噩梦。请注意 - 添加了一个新列,并且每个查询都应该得到修复!