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

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

Stack Overflow用户
提问于 2010-04-14 07: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 07: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 07:22:26

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

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

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

票数 1
EN

Stack Overflow用户

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

你看过NoSql数据库了吗?

http://nosql-database.org/

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

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

https://stackoverflow.com/questions/2638579

复制
相关文章
对象序列化与反序列化
对象的序列化,反序列化 对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化 序列化流(ObjectOutputStream),是过滤流—-writeObject 反序列化流(ObjectInputStream)—readObject 序列化接口(Serializable) 对象必须实现序列化接口 ,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public static void
待你如初见
2018/08/01
8320
C#学习笔记 对象序列化
代码可以在我的Github主页上找到,地址是https://github.com/techstay/csharp-learning-note 。
乐百川
2022/05/05
5740
C# 序列化与反序列化
对象持久化到文本文件,策略是:将对象的属性值打散,拆解,分别存储。 序列化:  保存对象的"全景图"  序列化是将对象转换为可保存或可传输的格式的过程  三种:   二进制序列器:    对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下     [Serializable] //使对象可序列化(必须添加)      特性       程序集,类,方法,属性都可以使用特性
房上的猫
2018/03/14
1K0
【接上篇】关于正态化
上次提到各种正态化的方法,本来想自己有空测一测对比下,后来发现很久以前已经有人做过这样的事情了。
量化小白
2019/10/09
6420
【接上篇】关于正态化
面向对象--序列化与反序列化
内存中的数据对象只有转换成二进制才可以进行数据持久化和网络传输。将数据对象转换成二进制的流程称之为对象的序列化(Serialization)。
田维常
2019/08/05
1.4K0
面向对象--序列化与反序列化
对象序列化与反序列化 原
第一步:定义对象 @SuppressWarnings("serial") class Person implements Serializable{ //实现Serializable接口 private String name; private Integer age; private Double height; public Person() { super(); } public Person(String name, Integer age, Double height) {
南郭先生
2018/08/14
5590
对象的序列化与反序列化
对象的序列化就是将Object转换成byte序列,反之叫做对象的反序列化 1.序列化流: ObjectOutputStream,是过滤流----->writeObject 反序列化流: ObjectInputStream ------->readObject 2.序列化接口: Serializable 对象必须实现序列化接口,才能进行序列化,否则将会出现异常 这个接口没有任何方法,只是一个标准 3.一个类实现了序列化接口,子类也就都能进行序列化了 java.io 接口 Serializable publ
拾点阳光
2018/05/11
1.1K0
Java 对象序列化与反序列化
所谓的对象序列化就是将 保存在内存中的对象数据转换为二进制数据流进行传输的操作 ;但不是所有对象都可以进行序列化,要被序列化的的对象那么其所在的类一定要实现 java.io.Serializable 接口,该接口并没有认识的操作方法,因为该接口是一个 标识接口 。
Mirror王宇阳
2020/11/13
4720
C#序列化与反序列化详解
序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。
用户9127601
2021/11/01
1.1K0
【Java 基础篇】Java transient 关键字详解:对象序列化与非序列化字段
在 Java 编程中,我们经常需要将对象序列化为字节流以便于存储或传输,或者将字节流反序列化为对象以恢复其状态。然而,并不是所有对象的所有属性都应该被序列化。有些属性可能包含敏感信息,或者它们只在内存中有意义。在这些情况下,我们可以使用 transient 关键字来标记属性,告诉 Java 序列化机制不要将其序列化。本文将深入介绍 transient 关键字的使用,让您完全掌握它的用法。
繁依Fanyi
2023/10/12
7690
【Java 基础篇】Java transient 关键字详解:对象序列化与非序列化字段
对象序列化流与反序列化流
=java序列化,就是指吧java对象转换为字节序列的过程。而反序列自然就是将字节对象恢复为java对象。==
兰舟千帆
2022/07/16
5560
对象序列化流与反序列化流
使用Fastjson序列化与反序列化对象
先建立JSONobject类,对于类里面的每个变量分别都有两个配套函数,一个都不可以少,一个是set,一个是get,其中set,与get后面的字母必须以大写字母开头
allsmallpig
2021/02/25
7140
对象持久化和数据序列化
数据序列化就是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。
致Great
2018/12/27
6890
C# 对象二进制序列化
using System.Runtime.Serialization.Formatters.Binary; public class SerializationUnit {             /// <summary>     /// 把对象序列化为字节数组     /// </summary>     public static byte[] SerializeObject(object obj)     {         if (obj == null)             return n
跟着阿笨一起玩NET
2018/09/18
1.2K0
C#实现Xml序列化与反序列化的方法
本文实例讲述了C#实现Xml序列化与反序列化的方法。分享给大家供大家参考。具体实现方法如下:
跟着阿笨一起玩NET
2022/05/10
1.3K0
正态性检验
在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的。这篇文章主要讲讲如何判断数据是否符合正态分布。主要分为两种方法:描述统计方法和统计检验方法。
张俊红
2019/11/14
2K0
Java IO详解(六)------序列化与反序列化(对象流)
该文讲述了序列化和反序列化在Java中的重要性,以及如何进行序列化和反序列化操作。序列化是将Java对象转换为字节流,以便在网络上传输或者持久化到磁盘。反序列化则是将字节流转换回Java对象。在序列化过程中,需要设置序列化版本,以确保反序列化时能够正确解析对象。同时,该文还介绍了如何通过ObjectOutputStream和ObjectInputStream进行对象序列化和反序列化操作,并给出了具体的示例代码。
IT可乐
2018/01/04
1.3K0
Java IO详解(六)------序列化与反序列化(对象流)
数据正态性的检验方法
https://www.cnblogs.com/REAY/p/6709177.html
Listenlii-生物信息知识分享
2020/05/29
1.3K0
C#序列化反序列化帮助类
//转载:http://hi.baidu.com/fxh19860822/blog/item/df35230b3ded441495ca6bd5.html 在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化 /// <summary> /// 提供序列化和反序列化对象的相关静态方法。 /// </summary> public class SerializerHelper { ///
跟着阿笨一起玩NET
2018/09/18
1.6K0
点击加载更多

相似问题

数据非正态化

24

表的非正态化(数据透视?)

12

非正态数C#

12

Lucene索引中数据库表的非正态化

10

非正态化如何成为NoSQL数据库的属性

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文