用于构建级别和升级的最佳数据库结构

时间:2018-11-18 11:10:43

标签: database sqlite

我正在构建一个游戏,玩家必须建造不同类型的建筑物并可以对其进行升级。有些建筑物可能可以升级到30级,而另一些建筑物只能升级到5级。

我想知道什么是最好的数据库布局。我正在使用sqlite3,如果有什么不同,但是问题也适用于其他引擎。

我的buildings表有两个选择:

选项一:创建一个building_group列以确认哪些建筑物相似:

id (Integer, Auto increment), building_name, building_group, level, points, cost
1, path, 1, 1, 100, 1000
2, road, 1, 2, 200, 2000
3, highway, 1, 3, 300, 3000
4, village, 2, 1, 1000, 10000
5, town, 2, 2, 2000, 20000
6, city, 2, 3, 3000, 30000

选项二:每个建筑物只有一个条目,并且所有级别信息都位于同一行中。对于我来说,这似乎不是最好的方法,但是我想我还是会提到它。

id (Integer, Auto increment), building_name_1, points_1, cost_1, building_name_2, points_2, cost_2, building_name_3, points_3, cost_3,...
1, path, 100, 1000,road, 200, 2000, highway, 300, 3000
2, village, 1000, 10000, town, 2000, 20000, city, 3000, 30000

我相信有更好的方法来解决这个问题,我想听听您的建议。

1 个答案:

答案 0 :(得分:0)

您已经指出,第二种方法没有什么意义。为了有效地查询或更新它,您必须动态地构造列名,这是难以跟踪错误的重要来源(如果操作不当,更不用说SQL注入的潜在漏洞了)。此外,迟早您会想到某些超级双格式特殊升级,其级别要比您最初计划的列高,并且您必须更改表的定义 strong>只是为了容纳它,这根本没有任何意义。

第一个设计似乎就像教科书上的做事方式,这将使您可以轻松地对建筑物以及玩家建造或未建造的建筑物进行复杂的查询。如果您需要将某些通用数据提取到整个建筑组中,则可以使用该信息创建另一个building_groups表,并将building_group中的buildings列作为其主键的外键