0

在 MySQL 中,每个用户都有一行,其中有一列包含由\n分隔的朋友姓名。

eg.
Friend1
Friend2
Friend3

我希望能够快速搜索 Friends 字段包含 Friend2 的所有用户。

我发现FIND_IN_SET但这仅适用于逗号,并且数据可以包含逗号和外来字符。

显然用正则表达式搜索会很慢。我是整个交叉引用的新手,所以我希望获得一些关于构建数据的最佳方式的帮助,以便可以快速找到它。

提前致谢。

编辑:好的,我忘了提一点,数据来自一个游戏,其中朋友的名字存储在本地,并且没有指向另一个用户 ID 的链接。因此字符串。每次他们连接时,我都会得到他们朋友的名字转储,我在后台使用这些名字来帮助匹配游戏。

4

3 回答 3

2

此类数据最常用的结构通常是添加一个额外的表。IE

user
    id,
    name
    email,
    e.t.c.

user_friend
    user_id
    friend_id

查询这是查询表的问题。IE

列出所有用户的朋友姓名:

SELECT friend_id
FROM user_friend 
WHERE user_id = :theUser

编辑:关于 OPs 编辑。也可以只存储名称。在这种情况下,表结构将变为:

user_friend
    user_id
    friend_name

和查询:

SELECT friend_name 
FROM user_friend 
WHERE user_id = :theUser
于 2013-01-29T02:03:08.843 回答
1

你为什么将朋友的名字保留为文本?如果用户删除了朋友或更改了他们的名字,这将是低效的编辑。那是另一回事,您应该通过一些 auto_increment id 键在数据库中存储朋友姓名。搜索整数比搜索字符串要快得多,尤其是在非常大的数据库中。你应该设置一个朋友表,就像

 Column 1: connectionid auto_increment key
 Column 2: user1id int
 Column 3: user2id int
 Column 4: date added date

等等...

然后,您可以在上面的连接表中搜索用户为 user1id 或 user2id 的所有行,并从中获取其他用户的列表。

于 2013-01-29T02:04:18.997 回答
1

我的数据库还没有填满,所以我可以很容易地更改存储数据的格式和结构。

是的,您需要稍微规范一下您的数据库。使用当前结构,您的搜索将非常缓慢并占用更多空间。

查看此wiki以获取有关规范化的详细帮助。

您可以将朋友表和用户表分开,并通过外键约束或内部连接将它们链接起来。

结构将是:

用户表

  • id: AUTO_INCRMENT PK
  • 姓名
  • 其他栏目

朋友桌

  • id:AUTO_INCREMENT(不是必需的,但适合分区)
  • 用户身份:
  • 好友ID
  • 添加日期
  • 其他信息(如果需要)。
于 2013-01-29T02:05:36.417 回答