【问题标题】:create mysql database for user profile为用户配置文件创建 mysql 数据库
【发布时间】:2010-11-27 23:50:21
【问题描述】:

我需要创建一个数据库,其中有 3 个表,一个是 FRIENDS,第二个是 USERS,第三个是 PICTURES。我在用户和朋友之间有一对多的关系。用户和图片表之间存在一对多的关系。我在这里有一个问题,标题是为用户配置文件构建数据库,但这有点令人困惑。他们有用户 ID 作为外键,但我认为图片 ID 应该是用户表中的外键。

还有一个问题是,我们能否在一张表中有 2 个外键,因为我的用户表与图片和好友表之间存在一对多关系。对不起,我不擅长数据库。我只是需要一些帮助。谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以根据需要拥有任意数量的外键。如果您想将多张图片链接到用户,则为 PICTURES 提供用户 ID 是有意义的。如果你希望每个用户只有一张图片,你可以给 USERS 一个 pictureid。

    你也可以两者兼得。如果您想查看主图片(如肖像图片或头像)并允许 PICTURES 拥有用户 ID,请参阅 USERS.pictureid,以便您也可以为每个用户管理一组图片。您还可以为用户提供多个图片 ID,例如 driverslicencepictureid、avatarpictureid、portraitpictureid 等,每个都是 PICTURES.pictureid 的外键。

    您甚至可以考虑将每张图片链接到多个用户的可能性,例如 facebook,它允许在多张图片中“标记”每个用户,但也允许在每张图片中标记多个用户。

    在这种情况下,您需要一个表格来附加这两个。定义一个包含用户标识和图片标识的 USERPICTURES 交叉表。您可以使用此表来定义用户和图片之间的交叉链接。

    正如我之前所说,除了交叉表之外,您仍然可以为每个用户指定特定图片的 id。

    当然,朋友也是如此。每个人都可以成为其他人的朋友。因此,在这种情况下,您也许可以使用 FRIENDS 表来存储两个用户之间的关系。给朋友表一个 User1Id 和一个 User2Id,它允许存储两个用户之间的连接(如果这是你想要的)。

    【讨论】:

    • Golez 感谢您的回复。如果我给用户 id 和 user2id 那么我必须定义一对多的关系,我认为我只是存储关系。图片和用户之间的其他关系是一对多的,因为用户可以拥有多张图片。我有以下表格和关系。
    • 视情况而定。如果您按照我的建议将 FRIENDS 表重新定义为某种 USERRELATION 表,您实际上会在用户之间创建多对多关系。 USERS.userid 和 RELATION.user1id 之间存在一对多关系,而 USERS.userid 和 RELATION.user2id 之间存在相同关系。如果您认为 FRIENDS 是一个不同的实体(不是用户本身),保留一个 FRIENDS 表可能会有所帮助,并且在 USERS.userid 和 FRIENDS.userid 之间具有简单的一对多关系。
    • Golez 感谢您的回复。如果我给用户 id 和 user2id 那么我必须定义一对多的关系,我认为我只是存储关系。图片和用户之间的其他关系是一对多的,因为用户可以拥有多张图片。我有以下表格。用户:id、用户名、密码、email、ip、端口、pk id。 Friends 表包含 id 为 pk,friendid。图片表包含 id 为 pk、文件路径、isprofile。你能在表中定义键吗?如果需要,我的意思是 fk 或唯一键。谢谢。
    • Pictures.UserId 是 FK,因为任何图片只能属于一个用户,但一个用户可以拥有多张图片。 Friends.User1Id 是 FK。一个关系显然是两个人之间的关系,这就是为什么关系/朋友表包含两个用户 ID,这可能会让您感到困惑。每个关系只有一个 user1,但任何用户都可以是多个关系中的 user1。 Friends.user2id 是同一类型的关系:关系中只有一个“第二人”,但用户可以是许多关系中的第二人。
    • 另外:users.userid 是 PK(因此是唯一的)。好友中 userid1 和 userid2 的组合也是独一无二的。您可以将此组合作为主键,但您也可以创建一个作为主键的relationshipid。我认为将主键设置为单个字段是一种很好的做法,但我认为这是一个品味问题。在你学习过程的这个阶段,实际的优点或缺点可能与你无关。
    【解决方案2】:

    如果您尝试创建某种 facebook 的“朋友”功能,那么您需要引用同一张表。例如,您的 USERS 表可能如下所示:

    用户 ID、姓名、电子邮件、朋友、)

    friends 字段然后可以通过列出他们的相关 (userID) 来引用许多用户的朋友,如下所示:

    “23、345、34、34、23”

    都在同一个字段中。您需要编写列出朋友的任何函数,然后可以将其与 explode() 一起使用来收集朋友详细信息。

    最后,是的,一个表中可以有 2 个外键,您可以拥有任意数量的外键。

    另外,更具可扩展性的方法是在您的数据库中包含以下表格。

    用户 朋友们 图片

    friends 表将列出两个用户之间的关系,如下所示:

    好友表

    user1 = 34 user2 = 44

    【讨论】:

    • 感谢您的回复。请看我上面的评论。
    【解决方案3】:

    您可以在一个表中拥有两个外键,但根据您的描述,您不会。朋友将有一个用户 FK,而图片将有一个用户 FK。对 FK 来说就是这样。

    首先要提出有关您的架构的问题(例如,如果用户是用户的朋友,他们的朋友仍然是用户,因此应该通过像 Friendships 这样的多对多链接表建立友谊),但是根据您的描述,您应该涵盖 FK,因为您在一张表中没有 2 个 FK。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 2019-05-23
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多