【问题标题】:Need help understanding this SQL (generated by doctrine)需要帮助理解这个 SQL(由学说生成)
【发布时间】:2023-03-24 23:11:01
【问题描述】:

我实际上正在阅读Doctrine Reference: One to Many, Unidirectional with Join table。但这可能更像是一个 SQL 问题。基本上,这应该模拟一对多的单向关系。我猜从 PHP 代码(在那个链接中),它使得 1 个用户有很多电话号码。

问题来自 SQL,似乎 1 个用户可以拥有多个电话号码。并且 1 个电话号码只能属于 1 个用户。我对吗?

CREATE TABLE User (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

CREATE TABLE users_phonenumbers (
    user_id INT NOT NULL,
    phonenumber_id INT NOT NULL,
    UNIQUE INDEX users_phonenumbers_phonenumber_id_uniq (phonenumber_id),
    PRIMARY KEY(user_id, 
phonenumber_id)
) ENGINE = InnoDB;

CREATE TABLE Phonenumber (
    id INT AUTO_INCREMENT NOT NULL,
    PRIMARY KEY(id)
) ENGINE = InnoDB;

ALTER TABLE users_phonenumbers ADD FOREIGN KEY (user_id) REFERENCES User(id);
ALTER TABLE users_phonenumbers ADD FOREIGN KEY (phonenumber_id) REFERENCES Phonenumber(id);

我不能将数据库简化为...下面...不需要连接表吗?

Users (id, name)
Phonenumbers (id, user [FK], number)

【问题讨论】:

  • 我已经更新了我的答案
  • 用户可以在没有电话号码的情况下存在吗? (我想是的)。 Phonenumber 用户可以在没有用户的情况下存在吗? (我想是的)。在这种情况下,您在两个实体之间建立了关系,该关系值得拥有自己的表。但是,我认为电话号码本身就是一个属性,而不是一个实体。
  • 这在实践中无论如何都是无用的设计。 :)

标签: sql doctrine


【解决方案1】:

正确,这是解决同一问题的两种有效方法。是的,users_phonenumbers 上的唯一索引意味着每个电话号码只能属于一个用户。

【讨论】:

  • 及时回答,David M。我正要发布一个完全错误的答案。
  • 看起来简单的方法是我在做one to many BiDirectional 时使用的方法,但为什么会有区别?
【解决方案2】:

设计实际上并不理想。

这个想法一定是有电话号码、用户,并且可以多对多链接。由于 phonenumberid 上的唯一索引,每个号码只能分配给一个用户。

那么整个 users_phonenumbers 就变得多余了,因为他们可以在 phonenumbers 表中添加一个 userid 列并为自己保存一个联接。

如果你问我的话,桌子设计不好。

【讨论】:

  • 抱歉,忘记看你的最后一行了。是的,连接是多余的,您可以按照您的建议简化设计。
  • @David M 说得对:两种方法都有效。你认为是“BAd”的那个是基于一个有价值的原则,一个表要么是实体表,要么是关系表,但绝不是两者。这只是风格问题,仅此而已。在您使用它的上下文中,“次优”一词是主观的(除非您愿意发布证明......?)
猜你喜欢
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 2016-07-08
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多