如何在 SQL 中正确创建此联结表?

问题描述 投票:0回答:1

我有一个主键为typ_id的表fahrzeugtyp。在该表中,存储了车辆的类型。另一个表是 ausstattung,其主键 ausstattungs_id 存储用户可以为汽车选择的设备类型。它们具有 m:n 关系,因为每种类型的车辆都有多种类型的设备,反之亦然。连接表被命名为typ-eq并使用它们的主键作为外键。现在我有一个“预订”表,其中存储正在使用 user_id 作为用户表中的外键进行预订的用户。现在我的问题是,我需要添加用户选择的汽车类型和设备,但是当我尝试使用typ-eq的PK作为FK 在预订表中。

如何才能将所有信息存储在一个预订行中?

sql relational-database
1个回答
0
投票

我是这么理解你说的;这是 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 电子表格),不 - 不要这样做,这不是你应该采取的方式。因为,迟早您会错过另一列(因此您必须更改表才能添加它),并且您编写的所有查询维护起来将是一场噩梦。请注意 - 添加了一个新列,并且每个查询都应该得到修复!

© www.soinside.com 2019 - 2024. All rights reserved.