Shaun M. Thomas:PG Phriday:肆意的动物虐待

💡 原文英文,约2200词,阅读约需8分钟。
📝

内容提要

本文介绍了在Postgres中创建简单虚拟宠物游戏的方法,包括玩家与宠物互动的限制和使用Row Level Security和触发器实现这些限制。还介绍了使用pg_cron创建游戏循环和方便玩家操作的包装函数。

🔎

延伸解读

数据库层强制规则的优势

文章通过虚拟宠物游戏展示了在数据库层面实现游戏规则的方法。使用行级安全策略和触发器,可以确保即使用户直接操作SQL也无法绕过规则,如宠物死亡后不可复活、不能转让等。这种设计适用于多数据入口场景,避免在每个入口重复实现逻辑,提升数据完整性。

pg_cron 的秒级调度应用

文章利用 pg_cron 的秒级调度功能来驱动游戏循环,定期减少宠物的食物和心情值。这展示了 pg_cron 在需要高频率定时任务时的实用性,例如模拟实时状态变化。但需注意,过于频繁的调度可能增加数据库负载,需根据实际需求调整。

包装函数与视图的便利性

为了简化玩家操作,文章提供了包装函数(如 new_pet、feed_pet)和视图(my_pet),将复杂的 SQL 操作封装成简单调用。这些函数仅作为便捷接口,核心规则仍由触发器保证。这种模式在开发中常见,既能提供友好接口,又不牺牲数据一致性。

游戏逻辑的局限与调整

初始游戏循环设置为每秒执行,导致宠物在24秒内死亡,远快于预期的24小时。作者随后将调度改为每小时执行,使宠物寿命更合理。这提醒我们,定时任务的频率需与业务逻辑匹配,否则可能产生意外结果。

❓

Q&A

如何在Postgres中创建虚拟宠物游戏?

可以通过创建数据库表、使用行级安全性和触发器来实现游戏逻辑,确保玩家只能与自己的宠物互动。

玩家与宠物的互动有哪些限制?

每个玩家只能拥有一只宠物,宠物死亡后永久死亡,且宠物不能转移给其他玩家。

如何使用pg_cron实现游戏循环?

可以通过定义一个函数来更新宠物状态,并使用pg_cron调度该函数以定期执行游戏循环。

Row Level Security在游戏中如何应用?

Row Level Security确保玩家只能访问和操作自己的宠物记录,防止其他玩家干预。

如何处理宠物的状态更新?

通过创建触发器来限制宠物的食物和心情值,确保宠物在状态不佳时会死亡。

游戏中如何确保数据完整性?

通过在数据库层面实现游戏逻辑和约束,确保数据的完整性和一致性。

🏷️

标签

➡️

继续阅读