浏览器游戏玩家-飞船数据库建模疑问:数量存储与表结构
浏览器游戏数据库建模:玩家与飞船关系设计
关于Spaceship表存储类型属性的可行性
你的思路完全合理:用Spaceship表单独存储3种飞船类型的名称、防御值等固有属性(后续还可扩展攻击力、建造资源、耗时等字段),每行对应一种飞船类型,这是类型表的标准设计方式,能避免重复存储相同类型的属性数据。
两种飞船数量存储方案对比
方案1:用COUNT统计(每艘飞船一条记录)
如果把玩家拥有的每一艘飞船都作为Spaceship表的一条记录,通过player_id外键关联Player表,统计数量时需按player_id和spaceship_type_id分组用COUNT(*)计算。但这个方案存在明显问题:
- 数据冗余:同类型飞船的属性会重复存储N次(N为玩家拥有的该类型飞船数量),浪费存储空间。
- 性能损耗:每次查询玩家飞船数量都要做分组统计,当玩家和飞船规模扩大时,查询效率会下降。
方案2:使用带quantity的中间关联表(推荐)
用PlayerSpaceship中间表(即你提到的“Player-has-Spaceship”表)是更优选择,表结构可设计为:
player_id(外键,关联Player表主键)spaceship_type_id(外键,关联Spaceship表主键)quantity(整数,存储玩家拥有该类型飞船的数量)- 联合主键:
(player_id, spaceship_type_id)(确保一个玩家同一种飞船类型仅存一条记录)
该方案的优势:
- 无冗余数据:飞船类型的固有属性仅在Spaceship表存储一次,中间表只存玩家与飞船类型的关联及数量。
- 查询高效:直接查询中间表就能获取玩家每种飞船的数量,无需聚合统计。
- 扩展性强:后续新增飞船类型时,只需在Spaceship表添加一行记录;若需给玩家的某类飞船增加额外属性(如升级等级),也可直接在中间表新增字段,灵活性更高。
关键注意点
不要在Spaceship表中直接存储player_id:Spaceship表是全局的飞船类型模板,不属于某个玩家,关联关系应放在中间表中。初始化时,玩家首次获得某类飞船就插入一条quantity=1的记录;后续建造时,直接更新对应记录的quantity字段即可(如quantity = quantity + 1)。
内容的提问来源于stack exchange,提问作者Triskeriaki
相关产品推荐
相关产品推荐

