Mysql 有两个表还是一个更大的表?

Mysql 有两个表还是一个更大的表?,mysql,database-design,optimization,Mysql,Database Design,Optimization,我在网上读到了很多关于优化MySQL的内容 我有一张关于朋友的桌子。我有两种不同的朋友:职业朋友和“社交”(非职业)朋友 我的问题是: 假设我有超过1000万的朋友(500万专业人士和500万社交人士)。 将它们全部放在一个有3列的表中是否更好 -idFriend1,-idFriend2,-专业 还是最好有两个表(专业和非专业的朋友),只有两列(行数只有一半) 顺便说一句,我必须在这张桌子上做一些加入,所以加入和不加入流程哪个最好?我想我误解了你的问题,你关心朋友是谁,需要定义他们之间的关系网。

我在网上读到了很多关于优化MySQL的内容

我有一张关于朋友的桌子。我有两种不同的朋友:职业朋友和“社交”(非职业)朋友

我的问题是:

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

-idFriend1,-idFriend2,-专业

还是最好有两个表(专业和非专业的朋友),只有两列(行数只有一半)


顺便说一句,我必须在这张桌子上做一些加入,所以加入和不加入流程哪个最好?

我想我误解了你的问题,你关心朋友是谁,需要定义他们之间的关系网。在这种情况下,我会把朋友信息放在一个表中,包括他们的名字等,并在他们之间有一个链接的另一个表

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,并执行联合查询


否则,以两种方式将所有关系输入到表中,这将使表的大小增加一倍,但避免了结合,而在我的经验中,这种结合是缓慢的。

我想我误解了你的问题,你既关心朋友是谁,也需要定义他们之间的关系网。在这种情况下,我会把朋友信息放在一个表中,包括他们的名字等,并在他们之间有一个链接的另一个表

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,并执行联合查询

否则,以两种方式将所有关系输入到表中,这会使表的大小增加一倍,但会避免合并,根据我的经验,合并速度较慢。

对“最佳”的评估取决于您在模型的其余部分中如何使用这些实体,以及您希望编写何种查询

如果职业朋友和社交朋友真的是一样的(除了他们的职业或社会地位),那么我就只做一张桌子。如果事实证明,职业朋友有一些不同的属性——比如职位、工作经历、公司名称——不同于社交朋友(可能有喜欢的饮料、喜欢的运动等),那么你可能会发现两个不同的子集表是有序的

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

然而,就目前而言,“最佳”是一个很高的要求,因为我们不知道您计划如何使用这些表,也不知道它们将如何与数据模型的其余部分相关联。

对“最佳”的评估取决于您在模型的其余部分中如何使用这些实体,以及您希望编写何种查询

如果职业朋友和社交朋友真的是一样的(除了他们的职业或社会地位),那么我就只做一张桌子。如果事实证明,职业朋友有一些不同的属性——比如职位、工作经历、公司名称——不同于社交朋友(可能有喜欢的饮料、喜欢的运动等),那么你可能会发现两个不同的子集表是有序的

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


但是,就目前而言,“最佳”是一个很高的要求,因为我们不知道您计划如何使用这些表,或者它们与数据模型的其余部分有什么关系。

我想检索id的专业朋友列表(另一方面,检索id的非专业朋友列表)。然后我必须将它们与用户的详细信息(姓名、电子邮件等)一起加入表中。我不会对其进行任何更新,只需插入和删除即可。要了解
idFriend1
idFriend2
的内容?它们之间的关系如何?同一个人(“朋友”)是否既“专业”又“社交”?我想检索id的专业朋友列表(另一方面,检索id的非专业朋友列表)。然后我必须将它们与用户的详细信息(姓名、电子邮件等)一起加入表中。我不会对其进行任何更新,只需插入和删除即可。要了解
idFriend1
idFriend2
的内容?它们之间的关系如何?同一个人(“朋友”)能既“专业”又“社交”吗?我有另一个想法。如果将iProfessional移动到关系表,会发生什么。这让安德鲁成为约翰的职业朋友,但萨莉的社交朋友,我有另一个想法。如果将iProfessional移动到关系表,会发生什么。这使得Andrew成为John的专业朋友,但SallyProf和Soc朋友的社交朋友是同一个“实体”(他们来自同一个表“用户”)。我想对Prof&Soc Friends表做的唯一一件事就是在两个不同的html表中列出