有2个表或1个更大的表MySQL吗?

时间:2013-01-01 20:25:00

标签: mysql database-design optimization

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

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

我的问题是:

假设我有超过1000万行(500万专业人士和5百万社交人士)的朋友。 将它们全部放在一个包含3列

的表中是否更好?

-idFriend1,-idFriend2,-isProfessional

或者,有2个表(专业和非专业朋友)只有2列(只有行数的一半)更好吗?

顺便说一下,我必须在这张桌子上做一些加入,这样最好有没有加入过程?

2 个答案:

答案 0 :(得分:3)

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

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

事实上,您可能会发现三个表是按顺序排列的:一个列出FriendID和所有常用属性(名称,年龄,地址)的朋友表;专业的朋友表(列出FriendID的专业属性);和社交朋友表(列出FriendID的社交属性)。这样,您就拥有了一个用于验证的超集,它具有所有公共属性和子集表。您还可以通过这种灵活性来决定朋友是否可以同时成为社交朋友和专业朋友。

尽管如此,“最佳”是一项很高的订单,因为我们对您计划如何使用表格以及它们与其他数据模型的相关性一无所知。

答案 1 :(得分:1)

我认为我误解了你的问题,而且你关心朋友是谁以及需要定义他们之间的关系网。在这种情况下,我会将朋友信息放入一个表中,包括他们的姓名等,并在另一个表中添加一个链接。

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中寻找他们的身份并进行联合查询。

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