首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >数据非正态化与C#对象数据库序列化

数据非正态化与C#对象数据库序列化
EN

Stack Overflow用户
提问于 2010-04-14 15:13:30
回答 4查看 2.2K关注 0票数 2

我正在使用一个DB表来处理各种不同的实体。这意味着我不能在其中有任意数量的字段来保存各种不同的实体。我希望只保存最重要的字段(日期、引用IDs各种其他表的外键、最重要的文本字段等)。还有一个额外的文本字段,我想在其中存储更完整的对象数据。

最明显的解决方案是使用XML字符串并存储这些字符串。第二个最明显的选择是JSON,它通常更短,而且也可能更快地序列化/反序列化.而且可能也更快。但这是真的吗?我的对象也不需要严格地序列化,因为JsonSerializer通常能够序列化任何东西。即使是匿名对象,也可以在这里使用。

,解决这个问题的最优方案是什么?

更多信息

我的数据库是高度正常化的,我使用的是实体框架,但是为了具有外部超快的全文搜索功能,我牺牲了一点DB去规范化。为了获取信息,我在MySql上使用了MySql。Sphinx将返回行I,用于快速查询经过优化的索引聚合表,以便从其中获取最重要的数据,比在DB中查询多个表要快得多。

我的桌子上会有如下的列:

  • 自动增量( RowID )
  • EntityID (指实际实体,但不直接相关,因为这必须指向不同的表)
  • EntityType (因此,如果需要的话,我可以得到实际的实体)
  • DateAdded (将时间戳添加到该表中时记录)
  • Title
  • Metadata (与特定实体类型相关的序列化数据)

此表将使用SPHINX索引器进行索引。当我使用这个索引器搜索数据时,我会提供一系列的EntityIDs和一个限制日期。索引器必须返回由RowIDs (降序)命令的非常有限的分页数量。然后,我将把这些RowIDs加入到我的表中,并得到相关的结果。所以这实际上不是全文搜索而是过滤搜索。以这种方式获取RowIDs非常快,从表中获得结果要比比较EntityIDsDateAdded比较要快得多,尽管它们将被正确地编入索引。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-14 15:25:22

在SQL数据库中保存数据不会导致长期痛苦的唯一方法是实际创建一个正确、规范化的索引模式,并在向域对象添加新属性时根据需要扩展该模式。

请不要尝试将对象“序列化”到SQL数据库。如果这确实是您想要做的,那么最好使用对象数据库(如db4o )。

更新:

根据评论和问题更新,我目前是这样理解问题空间的:

  • 表结构已经规范化;
  • 正使用一个全文引擎(Sphinx)来优化某些搜索;
  • 此处讨论的特定“序列化”数据将用作单个搜索结果的摘要或预览,而不表示完整的对象数据。

我对此的选择,按优先次序排列如下:

  • 使用FTS引擎的特性. 几乎每个FTS引擎,包括Sphinx,都允许将自定义属性存储为每个“文档”的一部分。现在,您说您只存储行ID,这样就可以加入到这个表中。如果您完全不加入,您的结果将返回得更快,而是将这些信息保存在全文索引本身中。你可以在这里设置一些很难的限制,但是如果你能绕过这个限制,这是你最好的选择。
  • 面向文档的数据库. 您说您甚至没有真正使用Sphinx的“全文”部分,您只是使用它来优化某些查询。那为什么不把中间的人裁掉呢?您建议将JSON作为序列化格式;MongoDB (仅举一个选项)本机支持布森。您仍然可以在公共列上创建索引,但与mysql不同的是,它实际上理解BSON格式,并且能够比关系数据库中的JSON或XML字符串更有效地存储数据。如果不管怎么说,您都可以自由地选择任何您想要的存储库;选择一个最适合您的特定需求的存储库。
  • 单表继承. 这是一个常见的设计,它通过转换规范化来实现映射的简单性。在你的例子中,整个目标是去正规化,所以这是一个很好的交易。如果有数以百计的列,这不是一个很好的选择,但是对于10或20列来说,这将很好,它将您的数据保持为“数据”,并且不应该以任何重要的方式影响性能。
  • XML列. 这种方法的优点是数据不是不透明的。在数据库的上下文中,它实际上是有意义的。如果您必须将这些信息存储在mysql数据库中--想必您希望运行一些临时查询--那么最好将其存储在mysql能够实际理解的格式中。另一方面,如果你100%的肯定,你永远不需要“反序列化”这个数据,直到它到达你的应用程序,那么我可能会选择.
  • 自定义二进制序列化格式. 如果您必须将数据存储在mysql数据库中,您可以肯定地知道,永远不需要在查询中索引或读取其内容,那么不要在臃肿的文本编码上浪费宝贵的I/O。与二进制相比,即使是JSON也会膨胀,因为JSON必须存储所有的属性名称;如果您自己进行序列化,您可以使用一两个字节来确定类型,然后按照已知的顺序反序列化剩余的字段/属性。只是数据没有元数据。

我甚至不会在这里使用.NET BinaryFormatter,我会创建自己的高度优化版本。毕竟,这需要快,快!而进入表中的每一个额外字节都会使查询速度变慢。您甚至可以通过GZip压缩一些数据,具体取决于其中的内容。

除非我还没有完全理解您的需求,否则我甚至不会考虑任何其他选择。

票数 3
EN

Stack Overflow用户

发布于 2010-04-14 15:22:26

不要这样做。这是个坏主意。

如果您真的必须这样做,我将使用XML。例如,Server允许您对XMl进行查询,只要该字段是XML类型。

从某种意义上说,您正在做的是面向对象数据库所做的事情。它们已经失宠了,因为ORM工具,比如Hibernate和Microsoft的实体框架( Entity ),在很大程度上允许你同时拥有OO和关系世界的精华。

票数 1
EN

Stack Overflow用户

发布于 2010-04-14 15:20:33

你看过NoSql数据库了吗?

http://nosql-database.org/

否则,我不得不说你的数据模型可能会给你带来困难.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2638579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档