我应该如何维护MySQL字段中的用户列表?

我应该如何维护MySQL字段中的用户列表?,mysql,database-design,list,Mysql,Database Design,List,我有一个用户表,每个用户都有一个唯一的用户id。每个用户还有一个存储在partner下的partner。一个用户一次只能有一个合作伙伴,但他始终会有多个合作伙伴。我想为他们过去合作伙伴的每个用户维护一个列表。我应该如何存储这样的列表? 我想我只需要一个名为Previor_partners的列,就可以为每个用户维护一个逗号分隔的列表。这是一个可能的解决方案吗?这是一个好的解决方案吗? 谢谢。您可能应该创建一个partners表,其中包含两个人的id和日期。最新日期为有效合作关系 +--------

我有一个用户表,每个用户都有一个唯一的用户id。每个用户还有一个存储在partner下的partner。一个用户一次只能有一个合作伙伴,但他始终会有多个合作伙伴。我想为他们过去合作伙伴的每个用户维护一个列表。我应该如何存储这样的列表? 我想我只需要一个名为Previor_partners的列,就可以为每个用户维护一个逗号分隔的列表。这是一个可能的解决方案吗?这是一个好的解决方案吗?
谢谢。

您可能应该创建一个partners表,其中包含两个人的id和日期。最新日期为有效合作关系

+----------+
| PARTNERS |
+----------+
| user_a   | (first partner)
+----------+
| user_b   | (second partner)
+----------+
| date     | (date the partnership began)
+----------+
这是一个相当基本的例子。根据具体的合作关系,您可能有其他领域

合作伙伴的历史记录将反映为一系列行:

Fizzbuzz Socks | Noke Shoes | Jan 23, 1983
StackOverflow  | GoogleDocs | Jan 29, 1992
Fizzbuzz Socks | Life Shoes | Nov 02, 1990
Fizzbuzz Socks | Sutt Shoes | Oct 18, 1995

从中我们可以看出,Fizzbuzz在历史上有三个合作伙伴关系,目前的合作伙伴关系是1995年10月18日开始的Sutt Shoes。对于每个新的合作关系,您都会创建一个新记录。

您可能应该创建一个partners表,该表包含两个人的id和日期。最新日期为有效合作关系

+----------+
| PARTNERS |
+----------+
| user_a   | (first partner)
+----------+
| user_b   | (second partner)
+----------+
| date     | (date the partnership began)
+----------+
这是一个相当基本的例子。根据具体的合作关系,您可能有其他领域

合作伙伴的历史记录将反映为一系列行:

Fizzbuzz Socks | Noke Shoes | Jan 23, 1983
StackOverflow  | GoogleDocs | Jan 29, 1992
Fizzbuzz Socks | Life Shoes | Nov 02, 1990
Fizzbuzz Socks | Sutt Shoes | Oct 18, 1995

从中我们可以看出,Fizzbuzz在历史上有三个合作伙伴关系,目前的合作伙伴关系是1995年10月18日开始的Sutt Shoes。对于每个新的合作关系,您都会创建一个新的记录。

从长远来看,您最好创建一个单独的表来管理这种关系,其中一个字段引用合作伙伴和用户。也许还有其他字段来指示哪种关系是活跃的。我能想到的第一个原因是,查询表中的字段要比查询逗号分隔文本字段中的值容易得多。

从长远来看,您最好创建一个单独的表来管理这种关系,字段引用合作伙伴和用户。也许还有其他字段来指示哪种关系是活跃的。我能想到的第一个原因是,查询表中的字段要比查询逗号分隔的文本字段中的值容易得多。

逗号分隔的列表是一个非常糟糕的主意。当试图加入到合作伙伴中时,很难与之合作。最好创建一个新表来保存历史关系。

用逗号分隔的列表是一个非常糟糕的主意。当试图加入到合作伙伴中时,很难与之合作。最好创建一个新表来保存历史关系。

我强烈建议使用关系数据库的强大功能来跟踪这些信息。我会创建另一个名为“partners”或类似的表,它有三列:“user\u id\u 1”、“user\u id\u 2”和“start\u date”。如果您愿意,可以添加一个“end\u date”列以便于查询

然后,当您有一个合作伙伴变更时,只需插入这个新表,如果您有一个“end_date”列,则相应地更新这些行。然后,当您想要从表中提取信息时,只需使用一个连接和一个子查询,该子查询将获取最新的合作伙伴信息,并且您的数据库中将始终存储更新的和历史的合作伙伴数据

从表面上看,用这种方式设置它要复杂一点,但随着时间的推移,它会让你收集到更多关于人与人之间关系的信息

编辑:

select查询的格式如下所示,如果包含end_date字段,在mySQL中会更容易:

SELECT u.user_id, coalesce(p1.user_id1, p2.user_id2) as current_partner_id
FROM users u
LEFT JOIN (
  SELECT user_id1, max(user_id2) as user_id2
  FROM partnerships
  WHERE end_date IS NULL
  GROUP BY user_id1
) p1 on p1.user_id1 = u.user_id
LEFT JOIN (
  SELECT max(user_id1) as user_id1, user_id2
  FROM partnerships
  WHERE end_date IS NULL
  GROUP BY user_id2
) p2 on p2.user_id2 = u.user_id
我的主要专业领域是MS SQL,而不是mySQL,但我相信以上内容将为您找到每个用户以及该用户的当前合作伙伴

然后,如果要查看给定用户的所有合作关系的历史记录,可以编写如下查询:

SELECT user_2 as partner_id, begin_date, end_date
FROM partnerships
WHERE user_1 = '{your user id of interest}'

UNION

SELECT user_1 as partner_id, begin_date, end_date
FROM partnerships
WHERE user_2 = '{your user id of interest}'

ORDER BY begin_date
这将为{your user id of interest}获得一个按时间顺序排列的伙伴关系记录集


我希望这有帮助

我强烈建议使用关系数据库的强大功能来跟踪这些信息。我会创建另一个名为“partners”或类似的表,它有三列:“user\u id\u 1”、“user\u id\u 2”和“start\u date”。如果您愿意,可以添加一个“end\u date”列以便于查询

然后,当您有一个合作伙伴变更时,只需插入这个新表,如果您有一个“end_date”列,则相应地更新这些行。然后,当您想要从表中提取信息时,只需使用一个连接和一个子查询,该子查询将获取最新的合作伙伴信息,并且您的数据库中将始终存储更新的和历史的合作伙伴数据

从表面上看,用这种方式设置它要复杂一点,但随着时间的推移,它会让你收集到更多关于人与人之间关系的信息

< p> 编辑:

select查询的格式如下所示,如果包含end_date字段,在mySQL中会更容易:

SELECT u.user_id, coalesce(p1.user_id1, p2.user_id2) as current_partner_id
FROM users u
LEFT JOIN (
  SELECT user_id1, max(user_id2) as user_id2
  FROM partnerships
  WHERE end_date IS NULL
  GROUP BY user_id1
) p1 on p1.user_id1 = u.user_id
LEFT JOIN (
  SELECT max(user_id1) as user_id1, user_id2
  FROM partnerships
  WHERE end_date IS NULL
  GROUP BY user_id2
) p2 on p2.user_id2 = u.user_id
我的主要专业领域是MS SQL,而不是mySQL,但我相信以上内容将为您找到每个用户以及该用户的当前合作伙伴

然后,如果要查看给定用户的所有合作关系的历史记录,可以编写如下查询:

SELECT user_2 as partner_id, begin_date, end_date
FROM partnerships
WHERE user_1 = '{your user id of interest}'

UNION

SELECT user_1 as partner_id, begin_date, end_date
FROM partnerships
WHERE user_2 = '{your user id of interest}'

ORDER BY begin_date
这将为{your user id of interest}获得一个按时间顺序排列的伙伴关系记录集


我希望这有帮助

理想情况下,我更愿意创建另一个带有用户id和合作伙伴名称的表。理想情况下,我更愿意创建另一个带有用户id和合作伙伴名称的表。我不需要在partnerships表中拥有与任何用户的合作伙伴一样多的列吗?因此,一个有26个合作伙伴历史记录的用户需要用户id、合作伙伴a、合作伙伴b,等等通过合作伙伴z?不,这是关系数据库的优点。不是每个合作伙伴有一列,而是每个合作伙伴对有一行。在这种情况下,您将有26行,每个行在两个person\u id字段中的一个字段中有user\u id,在另一个partner\u id字段中有partner\u a、partner\u b等。您需要使用begin_date字段来跟踪合作关系开始的日期,如果您愿意,可以使用end_date字段来跟踪合作关系结束的日期。我在原始答复中添加了一些具体的实施细节作为编辑。我不需要在合作关系表中拥有与任何用户的合作伙伴一样多的列吗?因此,一个有26个合作伙伴历史记录的用户需要用户id、合作伙伴a、合作伙伴b,等等通过合作伙伴z?不,这是关系数据库的优点。不是每个合作伙伴有一列,而是每个合作伙伴对有一行。在这种情况下,您将有26行,每个行在两个person\u id字段中的一个字段中有user\u id,在另一个partner\u id字段中有partner\u a、partner\u b等。您需要使用begin_date字段来跟踪合作关系开始的日期,如果您愿意,可以使用end_date字段来跟踪合作关系结束的日期。我在原始答复中添加了一些实施细节作为编辑。Jonathan,与我问Kyle的问题相同。我认为这最适合我。Kyle的答案是值得注意的,可能对许多应用程序来说是最好的,但这为我提供了我需要的东西和一点发展空间。谢谢。乔纳森,问你的问题和我问凯尔的一样。我认为这对我最合适。Kyle的答案是值得注意的,可能对许多应用程序来说是最好的,但这为我提供了我需要的东西和一点发展空间。谢谢