将对象保存到数据库时,我应该序列化对象还是保存每个属性

本文关键字:对象 保存 属性 序列化 数据库 我应该 | 更新日期: 2023-09-27 18:36:00

我开始考虑一个基本的数据库驱动游戏(rpg)。
我在整理如何保存角色、他的属性和他的物品时遇到了麻烦。 对于大多数只有一个静态的东西很好,但是当有多个对象(例如库存)时,我有点不知所措。

我决定将物品放入袋子对象中。 Bag 对象可以有 5 - 20 个插槽中的任何位置,每个插槽都将根据唯一的数据库 ID 引用一个项目。 那么我该如何设计袋子桌呢?

巴格 |所有者 |插槽 1 |插槽 2 |插槽3 |插槽4 ...

巴格 |所有者 |目录 <-varbinary

有什么建议吗? 曾经有人告诉我,当数据库编程时,一列一数据,但我不喜欢 Slot1 |插槽 2 等... 这似乎不对。

编辑

我是否完全错过了这个,它理所当然地应该引用袋子。

项标识 |巴格 |插槽 |姓名 |.....

然后,当您想找出袋子里的东西时,您会

Select * from Items where BagID=10  

将对象保存到数据库时,我应该序列化对象还是保存每个属性

有什么建议吗?

自 60 年代 cobb 发明关系数据库以来,标准方法是规范化。

BadId, SlotNr, ItemRef

完成。

另一个表包含这些项目。

请注意,缺少 OwnerId - 这是 BagItemMap 表。BagTable有BagId,OwnerId和可能的其他物品(总重量等)

这是一个标准的m:n关系。当您具体化对象时,您就有一个将项目作为集合的 Bag 对象。

持久性策略取决于查询要求。如果您正在寻找根据一个或多个属性一次对多个角色执行操作的能力(例如,为所有三眼角色提供额外的生命,查找所有生命值超过五个的角色等),那么您应该将各个属性保存到它们自己的列中。如果字符始终被视为 BLOB,并且将序列化策略绑定到 RDBMS 中的数据没有问题,请使用 varbinary

当您将所有内容存储为 BLOB 时,还可以使用混合解决方案,但也在其单独的列中提供属性子集。事实上,至少包含一些标识属性以简化搜索是很常见的。