【发布时间】:2018-09-28 20:08:01
【问题描述】:
场景
我需要设计一个来自多个来源和目的地的设备运动。我有以下示例表:
CREATE TABLE Area{
Id INT,
Name VARCHAR(50),
//some other fields
}
CREATE TABLE Stowage{
Id Int,
Name VARCHAR(50),
//some other fields
}
CREATE TABLE Movement{
OriginId INT,
DestinationId INT,
}
但我需要一些动作,例如:
- 原点:区域; 目的地:地区
- 原点:区域; 目的地:装载
- 原产地:积载; 目的地:地区
- 原产地:积载; 目的地:装载
但我只有两列,每列需要多个外键。
考虑可能的解决方案
- 创建 MovementArea、MovementStowage、MovementStowageArea 表并创建其适当的外键。
- 不要为 OriginId 和 DestinationId 列创建外键,并根据需要进行填充。
最后一个问题
是否有另一种方法可以在 sql 中解决这个问题,或者提供的哪种解决方案最适合这种情况?
【问题讨论】:
-
为什么 area 和 stowage 需要分开表?难道你不能将它们存储在同一个表中,使用
IDName和Type(面积/积载)列来避免这个问题吗? -
@APH 可能是一个解决方案,但 Stowage 和 Area 有不同的目的,不同的列(我没有在示例中添加,只是发表评论)并且来自不同的来源
-
嗨。事物是其他事物的子类型。因此 SQL/数据库子类型/继承。反模式是 2/many/multiple FK 到 many/multiple/2 表。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和特定的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并通过minimal reproducible example 采取行动。
-
PS FK 是指列列表的子行值必须出现在其他地方。因此,您不需要“每列需要多个外键”。你有一些让你想起 FK 的东西。在这里,您需要多个列,其中每个列是 FK,只有一个是非 NULL,或者一个列是 FK,引用包含第一种情况下引用列的 UNION 的列。
标签: sql database foreign-keys relational-database