我正在开发一个应用程序,用户可以“争取”拥有地图的大部分内容。每张地图由1000个地区组成。现在我的初步计划是将用户拥有的区域存储为逗号分隔的字符串,例如
用户拥有区域1到10 1,2,3,4,5,6,7,8,9,10
问题是用户可能拥有所有1000 这意味着它可能是一个长度为3893个字符的字符串......我将它存储为varchar(3893)......这看起来非常低效。
我确实考虑过二元解决方案,例如
1111111111后跟990 0's
如果只有一个用户拥有整个网格,那么这是一个很好的解决方案,因为它是1000个字符,但如果它的4个或更多,则其效率会降低。
此外,我需要考虑一种易于计算回逗号分隔字符串的方法,因为这是我的javascript将如何使用它。
谢谢,
答案 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)
);
然后,您可以轻松获取列表并快速查找哪些用户拥有哪些区域等。