SQL:与3个表的1对1关系 - 是否可以让1个键引用2个不同的表ID(键)?)

时间:2018-01-16 16:58:25

标签: sql oracle oracle-sqldeveloper

我找不到任何适用于我的例子的内容,也不知道如何标题。

基本上,我有3张桌子:

Workers
Shop
Warehouse

工人可以在商店或仓库工作,但从不在两者中工作。

我被告知我应该在商店和仓库之间建立一对一的关系,其中将创建一个表(?),这将被称为“WorkingLocation”,它将包含 workingLocationId < / strong>和一个额外的ID,表明它是商店还是仓库。我认为这样的东西:

Worker
workerId
name
workingLocationId

Shop
shopId
name

Warehouse
warehouseId
name

WorkingLocation
workingLocationId
shopOrWarehouseId

shopOrWarehouseId 知道它是商店还是仓库。

我可能会误解1对1的关系是什么,并且可能记错了,但我基本上希望能够分辨出工人在哪里工作,知道他可以在商店或工作仓库,但从不在两者中。

我想知道CREATE TABLE

CREATE TABLE Worker
(
    workerId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL,
    workingLocationId REFERENCES WorkingLocation(workingLocationId) NOT NULL
);

CREATE TABLE Shop
(
    shopId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL
);

CREATE TABLE Warehouse
(
    warehouseId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL
);

CREATE TABLE WorkingLocation
(
    workingLocationId Number(2) PRIMARY KEY NOT NULL,
    shopOrWarehouseId REFERENCES (Shop(shopId), Warehouse(warehouseId)) -- I want to know how to do this, if it is possible
);

这可能吗?如果没有,我怎么能做出类似的东西?

(我的老师告诉我这件事,但是很久以前就已经很久了,因为我不得不为考试而学习,我忘记了它是如何运作的,我相信他告诉它会知道它是否重复它就像有两张桌子或其他东西)

我正在使用sql developer

1 个答案:

答案 0 :(得分:1)

这是&#34;其中一个&#34;关系。仅举两个例子,两个单独的列可能是最简单的解决方案:

CREATE TABLE Shops (
    shopId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL
);

CREATE TABLE Warehouses (
    warehouseId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL
);

CREATE TABLE Workers (
    workerId Number(2) PRIMARY KEY NOT NULL,
    name Varchar2(25) NOT NULL,
    shopId Number(2) references shops(shopId),
    warehouseId Number(2) references warehouses(warehouseId),
    check ( (shopId is not null and warehouseId is null) or
            (shopId is null and warehouseId is not null)
          )
);

第四张表并没有真正帮助。