【发布时间】:2016-12-08 00:58:38
【问题描述】:
假设有两个表。(我做了示例表只是为了解释我的想法的概念,定义它会有一些错误。)
TableA“用户”
CREATE TABLE user
(
id serial PRIMARY KEY
name character varying(80) UNIQUE NOT NULL,
)
表B“历史”
CREATE TABLE history
(
id serial PRIMARY KEY,
action character varying(80) NOT NULL,
CONSTRAINT history_action_key UNIQUE (name)
)
我认为有两种方法可以在两个表之间建立关系。
一种方式:在一个表中添加 ForeignKey 约束
CREATE TABLE user
(
id serial PRIMARY KEY,
name character varying(80) NOT NULL UNIQUE,
history_id integer REFERENCES history
)
这意味着在用户表中还有一个名为history_id的字段用于指向与FK相关的历史记录。对吧?
第二种方式:您正在创建新表(比如说 TableC 'relationship')。 TableC 将只显示 TableA 和 TableB 之间的关系
CREATE TABLE relationship
(
id serial PRIMARY KEY,
user_id integer NOT NULL REFERENCES remann_users (id),
history_id integer NOT NULL REFERENCES history,
)
所以我的问题是
第二种在数据库中存储数据的方式更灵活吗?
我觉得第二种方式似乎更灵活 因为用户表和历史表在单独的表中完全分开。只是另一个表有数据来说明他们的关系。但第一种方式似乎用户表在其表中有一个字段“history_id”。所以我觉得它的方式更像是两个表之间的耦合。
我的想法对吗?
我想我首先对 manyTomany 关系感到困惑。
'user' 表有如下数据
包名
1 约翰
2 亚当
3 凯利
'history' 表有如下数据
PK 动作
1 打过篮球
玩过2个电子游戏
现在我想在用户和历史之间建立关系。
如果 John 打篮球,Adam 打篮球,Kelly 打电子游戏,我可以通过在 user 表中多放一列来建立关系。
'用户'表
pk 名称 fk
1 约翰 1
2 亚当 1
3 凯利 2
但如果有约翰打篮球同时打电子游戏的情况。这成了许多Tomany的关系。我需要像下面这样来显示这种关系。
'用户'表
pk 名称 第一个动作(fk) 第二个动作(fk)
1 约翰 1 2
2 亚当 1 空
3 凯利 2 NULL
但这是个坏主意,因为如果您想为某个特定用户添加更多操作,则必须更改架构。例如,用户打篮球、踢足球和玩视频游戏。您需要添加第三个操作(fk),其他用户行将具有空值。
因此您可以制作另一个表格来组合两个表格而不会出现此问题。这将是我上面解释的第二种方式。制作另一个表来显示两个表之间的关系只是在多对多情况下提高效率的方法。对吧?
这是我对您的回答感到困惑的地方。 “更灵活” 更灵活意味着如果您有第二种方式的桥接表,则显示 m2m 数据更灵活,或者只是 m2m 关系更灵活?我比什么更困惑?
【问题讨论】:
-
我更新为使用更简洁的创建表语法。
-
我认为上面有一些错误,不知道你想如何澄清它们,但我保持原样。
-
还有几点,不要使用
character varying(80)代替name,使用text。另外,不要使用id,使用user_id或id_user(我最喜欢的)。如果将所有 pkey 标记为id,则不能使用USING或NATURAL JOIN,这也会使您的查询更加混乱。 -
谢谢,我只是想用示例表来解释我的问题的概念。我实际上并没有注意语法。那么你对我的问题有什么想法吗?我想知道用 FK 建立两个表之间关系的两种方法是否有区别,或者一种比另一种更灵活。
标签: database postgresql foreign-keys table-relationships