【问题标题】:Having 2 tables or 1 larger table MySQL?有 2 个表或 1 个更大的表 MySQL?
【发布时间】:2012-12-16 08:10:25
【问题描述】:

我在互联网上阅读了很多关于优化 MySQL 的不同内容。

我有一张关于朋友的桌子。我区分了 2 种朋友:专业朋友和“社交”(非专业)朋友。

我的问题是:

假设我有超过 1000 万行(500 万专业和 500 万社交)朋友。 将它们全部放在一个有 3 列的表中会更好吗

-idFriend1, -idFriend2, -isProfessional

或者最好有 2 个表(专业和非专业朋友)只有 2 列(并且只有一半的行数)?

顺便说一句,我将不得不在这张桌子上做一些加入,那么有和没有加入过程哪个最好?

【问题讨论】:

  • 我想检索一个 id 的专业朋友列表(另一方面,检索一个 id 的非专业朋友列表)。然后我必须将它们与用户的详细信息(姓名、电子邮件等)一起加入表格。我不会对其进行任何更新,只是插入和删除。
  • idFriend1idFriend2 指的是什么?它们是如何相互关联的?同一个人(“朋友”)是否可以既“专业”又“社交”?

标签: mysql database-design optimization


【解决方案1】:

“最佳”的评估取决于您在模型的其余部分中如何使用这些实体,以及您想编写什么样的查询。

如果专业朋友和社交朋友真的相同(除了他们的专业或社会地位),那么我只会制作一张表。如果事实证明专业朋友有一些不同的属性——比如职位、工作单位、公司名称——不同于社交朋友(可能有最喜欢的饮料、最喜欢的运动等),你可能会发现这两个不同的子表是按顺序排列的。

实际上,您可能会发现三个表是按顺序排列的:好友表,其中列出了 FriendID 和所有常见属性(姓名、年龄、地址);专业朋友表(列出 FriendID 的专业属性);和一个社交好友表(其中列出了 FriendID 的社交属性)。这样,您就有了一个用于验证的超集,作为具有所有公共属性以及子表的实体。然后,您还可以灵活地决定一个朋友是否可以同时成为社交朋友和职业朋友。

不过,就目前而言,“最好”是一项艰巨的任务,因为我们不知道您打算如何使用这些表,也不知道它们将如何与您的其他数据模型相关。

【讨论】:

  • Prof & Soc Friend 是同一个“实体”(它们来自同一个表“用户”)。我想要对 Prof & Soc Friends 表做的唯一事情是在 2 个不同的 html 表中列出专业朋友列表和社交朋友列表。 (有时仅在某些页面上仅显示专业(或社交)朋友的列表)。唯一的互动:我可以添加或删除教授/社交朋友。在我的数据库中,我只会将这些表加入到用户表中以获取有关用户的所有信息。
【解决方案2】:

我想我误解了你的问题,你既关心朋友是谁,又需要定义他们之间的关系网络。在这种情况下,我会将朋友信息(包括他们的姓名等)放入一个表中,并在另一个表中包含它们之间的链接。

CREATE TABLE FRIEND (
  id int auto_increment primary key,
  name varchar(20)
);

INSERT INTO FRIEND (name)
VALUES 
('Andrew')
('John')
('Sally')

CREATE TABLE RELATIONSHIP (
  relationshipId int auto_increment primary key,
  friendId1 int,
  friendId2 int,
  isProfessional boolean
);

INSERT INTO RELATIONSHIP (friendId1, friendId2, isProfessional)
VALUES
(1, 2, TRUE),
(1, 3, FALSE);

友谊是互惠的,因此在搜索特定人的朋友时,您需要在朋友 1 和朋友 2 中查找他们的 id 并进行联合查询。

否则,以两种方式将所有关系都输入到表格中,这会使表格的大小加倍,但会避免联合,根据我的经验,联合是很慢的。

【讨论】:

  • 我有另一个想法。如果将 isProfessional 移至关系表会怎样。这使安德鲁成为约翰的职业朋友,但成为莎莉的社交朋友
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2023-03-26
  • 2014-10-11
相关资源
最近更新 更多