【问题标题】:Basic structuring of MySQL databaseMySQL数据库的基本结构
【发布时间】:2011-02-20 04:47:19
【问题描述】:

我是 MySQL 的新手,我需要帮助解决一个相对基本的问题。

假设我有一个按行列出个人的自动增量表。我在列中包含了每个人的所有基本信息,例如姓名、年龄、种族等。但是假设我也想包括人们的朋友列表。由于这些列表将是动态的,并且据我所知,您不能在单个表中包含两个自动增量变量,因此无法在该特定表中包含朋友列表,因为没有子表或任何类似的东西MySQL 中的排序(再次据我所知)。如果您想要动态的朋友列表,则必须创建一个专门用于该目的的新表。

我的想法是对的吗?还是我错过了什么?

这是我目前的总体想法(我不太喜欢):

table people_list {
  person_id (auto-increment)
  name
  age
  race
  ...
}

table friends_lists {
  friendship_id (auto-increment)
  person_id1
  person_id2
}

请注意,我只是为了演示而编写了MySQL的本质语法。

有没有更好的办法?

【问题讨论】:

  • 这(基本上)我会怎么做
  • 我怕有人这么说。 :P 感谢您的意见。
  • 正确总比错误好:-)
  • friends_lists 通常被称为“关联表”,是此类事情的标准 SQL 方法。
  • 好吧,我想这就是我接下来要做的事情。谢谢大家!

标签: php mysql database database-design


【解决方案1】:

您的方法是正确的...除了辅助表(在您的场景中为friends_lists)之外,没有其他方法可以做到这一点。这就是如何实现两个表之间的“多对多”关系。

在您的情况下,这两个表是相同的 (people_list),但从概念上讲,它们可以被视为“朋友”和“人”

但是,我可以给你一些关于这种方法的提示吗?

1 - 在某种程度上,每个表都是一个“列表”。那么,为什么后缀“_list”?不要,出于同样的原因,我们不使用复数作为表名(它的产品,而不是产品*s*。当然会有很多;)

2 - 将 person_id1 和 person_id2 都变成主键,而不是在朋友处使用自动递增 id。你摆脱了一个无用的列,这样你就可以强制每对人 X - 朋友 Y 是唯一的。

3 - 根据上下文给出 person_id1 和 2 个有意义的名称,例如“person_id”和“friend_id”

总结一下:

table person {
  person_id (auto-increment, primary key)
  name
  age
  race
  ...
}

table friend {
  person_id (foreing key from person, primary key)
  friend_id (foreing key from person, primary key)
}

【讨论】:

    【解决方案2】:

    为什么不

    table people_list {
      person_id (auto-increment)<
      name
      age
      race
      ...
    }
    
    table person_friend {
      person_id(of person)
      person_id(of friend)
    }
    

    查看this 以更好地了解一对多关系。

    【讨论】:

    • 我很确定这正是他所拥有的。
    • 啊..是的。好像我误会了。对此感到抱歉。
    • @nathan gonzalez:这不是 OP 所拥有的。 Can't Tell 明智地从 person_friend 表中省略了不必要的自动增量。
    • @catcall,我不知道我会称之为明智的,因为这种表中缺少代理键使得很难找到、删除或更新您正在查找的行为了。删除 id 为 x 的行似乎比删除具有我的用户 ID 的父级和另一个用户 ID 的子级的行要容易得多,更不用说索引会更有效。为什么要让事情变得比它需要的更复杂,对吧?
    • @nathan gonzalez:您已经有两个指向父表的外键。这对列必须声明为PRIMARY KEYUNIQUE。这两列都将被索引。任何时候你需要从 person_friend 中删除一行,你就已经知道这个人和朋友的 ID 号了。 (如果您不知道这两个 id 编号,则没有删除行的业务。)所有额外的自动递增 id 编号都会降低性能。 (并增加删除错误行的可能性。)
    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多