Mysql 有两个表还是一个更大的表?
我在网上读到了很多关于优化MySQL的内容 我有一张关于朋友的桌子。我有两种不同的朋友:职业朋友和“社交”(非职业)朋友 我的问题是: 假设我有超过1000万的朋友(500万专业人士和500万社交人士)。 将它们全部放在一个有3列的表中是否更好 -idFriend1,-idFriend2,-专业 还是最好有两个表(专业和非专业的朋友),只有两列(行数只有一半)Mysql 有两个表还是一个更大的表?,mysql,database-design,optimization,Mysql,Database Design,Optimization,我在网上读到了很多关于优化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表中列出