【发布时间】:2013-02-16 08:36:31
【问题描述】:
这是我很长一段时间以来一直想知道的事情,但还没有看到真正的(好的)解决方案。这是我想象很多游戏都会遇到的问题,而且我无法轻易想到如何解决(好吧)。欢迎提出想法,但由于这不是一个具体的问题,所以不要费心询问更多细节 - 只是弥补它们! (并解释你的编造)。
好吧,所以,许多游戏都有(库存)物品的概念,而且通常有数百种不同种类的物品,所有物品的数据结构通常都非常不同 - 有些物品非常简单(“一块石头”),其他人可能有疯狂的复杂性或背后的数据(“一本书”、“一个编程的计算机芯片”、“一个装有更多物品的容器”)等等。
现在,这样的编程很容易——只要让所有东西都实现一个接口,或者扩展一个抽象的根项。由于编程世界中的对象不必在内部和外部看起来相同,因此任何类型的项目具有多少和什么样的私有字段确实没有问题。
但是当涉及到数据库序列化(二进制序列化当然没问题)时,您将面临一个难题:您将如何在典型的 SQL 数据库中表示它?
我所看到的解决方案的一些尝试,但没有一个令我满意:
-
项目的二进制序列化,数据库只保存一个ID和一个blob。
- 专业版:实施大约需要 10 秒。
- 缺点:基本上牺牲了所有数据库功能,难以维护,几乎不可能重构。
-
每个项目类型一个表。
- 专业人士:干净、灵活。
- 缺点:由于 SQL 没有表/类型“引用”的概念,因此有数百个表种类繁多,每次搜索项目都必须查询它们。
-
一个表有很多字段,并不是每个项目都使用。
- 专业版:实施大约需要 10 秒,仍然可以搜索。
- 缺点:浪费空间、性能、让数据库混淆以判断正在使用的字段。
-
一些带有一些“基本配置文件”的表格用于存储,相似的项目被放在一起并使用相同的字段来存储不同的数据。
- 专业人士:我什么都没有。
- 缺点:浪费空间、性能、让数据库混淆以判断正在使用的字段。
你有什么想法?您是否见过另一种效果更好或更差的设计?
【问题讨论】:
-
听起来你想要一个 [Entity-Attribute-Value][1] 模式。 [1]:stackoverflow.com/questions/4705860/…
-
数据库表中的建模继承已被本网站上的许多帖子所涵盖。我在这篇文章中没有看到的一个选项是:每个类一个表(包括基类)。对于每个对象,在对象的类层次结构的每个表中都放置一条记录。每个表只包含该类实现的新字段。要获取对象的所有字段,请连接其继承层次结构的所有表。
标签: database database-design data-structures