0

这可能看起来很奇怪,但我想知道是否有可能让 MySQL 表有一个可以包含值列表的列。例如,假设我有一个代表像 facebook 这样的朋友列表的表格,我如何在表格中模拟它?我认为您可以将用户名添加到属性列中,但不确定这是最好的主意,甚至不确定如何做到这一点。关于如何实现这一目标或替代方案的任何建议?

4

3 回答 3

2

在某些情况下,您可以使用SET 类型,它的功能类似于ENUM 类型。它允许您在字段中存储一个或多个预定义值。但是,对于 facebook 好友的情况,这是不切实际的,因为每次创建新用户时,列定义都需要更新。

Wolfram 对映射表的建议绝对是更好的解决方案,因为它还允许使用外键约束,这将确保删除一个用户时的引用完整性(假设您使用级联)。此外,如果您需要在 JOIN 中使用关系,那么映射表是唯一的解决方案。

于 2012-10-14T03:48:01.370 回答
1

因此,与 facebook 示例保持一致,您正在寻找的是有一个包含两列的表格。第一个,标识用户,第二个是该用户的朋友列表?

据我所知,您不能将列视为数组。您可以有一个字符串,其中包含用破折号分隔的所有个人名称,但这并不可靠。

我的建议是有一个有两列的朋友表,这两列都是 varchars 或字符串。每列仅包含 1 个人的姓名或 id,表示这两个人之间的友谊。

然后,如果您想要 foobar 的朋友列表,您只需查询:

SELECT *
FROM friends
WHERE user_a == 'foobar' || user_b == 'foobar'

现在,这实际上会为您提供两列,其中之一是 foobar,其中之一是他/她的朋友。因此,您可能需要有一点创意才能将其分成 foobar 的朋友,但我相信您可以找到一种适用于您的代码的方法。

于 2012-10-14T03:23:37.010 回答
1

虽然这通常不是一个好主意,但 MySQL 确实有这个:

FIND_IN_SET('b','a,b,c,d')

SELECT ... FROM friends WHERE FIND_IN_SET('foo',friends_list) > 0;

所以你可以很容易地做你所要求的。只是通常不建议这样做。

于 2012-10-14T04:04:51.990 回答