【问题标题】:When saving objects to a database should I serialize the object or save each property将对象保存到数据库时,我应该序列化对象还是保存每个属性
【发布时间】:2012-05-31 02:02:43
【问题描述】:

我开始考虑一个基本的数据库驱动游戏(rpg)。
我无法弄清楚如何保存角色、他的属性和他的物品。对于大多数只有其中一个的东西是静态的很好,但是当有多个对象(例如库存)时,我就有点不知所措了。

我决定把物品放进袋子里。 bag 对象可以有 5 到 20 个插槽,每个插槽都将根据唯一的数据库 ID 引用一个项目。那么我该如何设计包桌呢。

包ID |所有者 |插槽 1 |插槽 2 |插槽 3 |插槽 4 ......

包ID |所有者 |内容

有什么建议吗?曾经有人告诉我,在数据库编程时,一列一数据,但我不喜欢 Slot1 的想法 | Slot2 等...看起来不太对。

编辑

我是不是完全错过了这个,它应该是引用 Bag 的项目。

物品ID |包ID |插槽 |姓名 | .....

那么当你想知道一个包里有什么时,你会

Select * from Items where BagID=10  

【问题讨论】:

    标签: c# sql oop


    【解决方案1】:

    有什么建议吗?

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

    BadId、SlotNr、ItemRef

    完成。

    另一个表有项目。

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

    这是一个标准的 m:n 关系。当您实现对象时,您将拥有一个 Bag 对象,该对象将 Items 作为集合。

    【讨论】:

    • 那么您的建议是我在 cmets 中添加的内容正确吗?当然包包也一样,包包主人不认识包包认识主人?
    • 最后一个取决于设计;)所有者可能知道这个包,但另一个允许多个包,因此更具战略意义。
    【解决方案2】:

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

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

    【讨论】:

    • 好的,我明白了,谢谢,我还不知道我的需求,所以我不确定我是否需要寻找所有绿眼睛的人。虽然我想我会,或者至少想保持这个选项开放。我是否需要在项目级别上使用它,我对此表示怀疑。
    • 其实这是错误的。我希望这主要是一个“几乎没有搜索”的对象,以及基本上基本上在内存中处理的东西。
    • @TomTom 在实践中我需要实现全 BLOB 解决方案的唯一情况是构建持久缓存时。本质上,唯一可搜索的部分是对象的名称 - 其他所有内容都在 BLOB 中。
    • 嗯...实际上.... Eve Online 出于性能原因执行持久性 blob;)
    猜你喜欢
    • 2015-02-16
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    相关资源
    最近更新 更多