mysql - 更有效地存储逗号分隔的字符串

时间:2009-11-02 12:08:06

标签: mysql database database-design

我正在开发一个应用程序,用户可以“争取”拥有地图的大部分内容。每张地图由1000个地区组成。现在我的初步计划是将用户拥有的区域存储为逗号分隔的字符串,例如

用户拥有区域1到10 1,2,3,4,5,6,7,8,9,10

问题是用户可能拥有所有1000 这意味着它可能是一个长度为3893个字符的字符串......我将它存储为varchar(3893)......这看起来非常低效。

我确实考虑过二元解决方案,例如

1111111111后跟990 0's

如果只有一个用户拥有整个网格,那么这是一个很好的解决方案,因为它是1000个字符,但如果它的4个或更多,则其效率会降低。

此外,我需要考虑一种易于计算回逗号分隔字符串的方法,因为这是我的javascript将如何使用它。

谢谢,

3 个答案:

答案 0 :(得分:9)

为什么不规范你的桌子?有一个简单匹配数字对的表 - 一个是玩家的ID,另一个是区域的ID。如果玩家控制5个区域,则表格中将有5行。如果他们控制1000,他们有1000行。这就是关系数据库的设计和优化方式。

示例:

table `users`:

ID  Name
------------
1   John
2   Jessie
3   James

table `regions`:

ID  Name
------------
1   France
2   China
3   Australia

table `ownership`:

Owner  Place
------------
1      1
1      3
3      2

因此,约翰目前拥有法国和澳大利亚,詹姆斯拥有中国。

这不仅简化了您的列类型,而且由于它已经规范化,您可以在您可以运行的查询类型中具有更大的灵活性 - 例如,您可以询问“拥有X区域的人的姓名是什么”或者“人Y拥有多少个地区”,而无需亲自手动解析任何内容 - 数据库可以为您进行处理。

答案 1 :(得分:2)

为什么不将用户拥有的区域的ID存储在单独的表中? 用户ID | OwningLandPlotID

然后,您可以在PHP中选择all和implode()以生成逗号分隔的字符串。你有什么服务器环境?

答案 2 :(得分:1)

拥有用户不是更好 - >区域映射表?

例如

CREATE TABLE `usertoregion` (
  `iUser` int(11),
  `iRegion` int(11)
);

然后,您可以轻松获取列表并快速查找哪些用户拥有哪些区域等。