0

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

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

我的问题是:

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

-idFriend1,-idFriend2,-isProfessional

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

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

4

2 回答 2

3

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

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

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

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

于 2013-01-01T20:31:03.320 回答
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 中查找他们的 id 并进行联合查询。

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

于 2013-01-01T20:30:09.440 回答