我正在使用一个DB表来处理各种不同的实体。这意味着我不能在其中有任意数量的字段来保存各种不同的实体。我希望只保存最重要的字段(日期、引用IDs各种其他表的外键、最重要的文本字段等)。还有一个额外的文本字段,我想在其中存储更完整的对象数据。
最明显的解决方案是使用XML
字符串并存储这些字符串。第二个最明显的选择是JSON
,它通常更短,而且也可能更快地序列化/反序列化.而且可能也更快。但这是真的吗?我的对象也不需要严格地序列化,因为JsonSerializer通常能够序列化任何东西。即使是匿名对象,也可以在这里使用。
,解决这个问题的最优方案是什么?
更多信息
我的数据库是高度正常化的,我使用的是实体框架,但是为了具有外部超快的全文搜索功能,我牺牲了一点DB去规范化。为了获取信息,我在MySql上使用了MySql。Sphinx将返回行I,用于快速查询经过优化的索引聚合表,以便从其中获取最重要的数据,比在DB中查询多个表要快得多。
我的桌子上会有如下的列:
RowID
)EntityID
(指实际实体,但不直接相关,因为这必须指向不同的表)EntityType
(因此,如果需要的话,我可以得到实际的实体)DateAdded
(将时间戳添加到该表中时记录)Title
Metadata
(与特定实体类型相关的序列化数据)此表将使用SPHINX索引器进行索引。当我使用这个索引器搜索数据时,我会提供一系列的EntityIDs
和一个限制日期。索引器必须返回由RowIDs
(降序)命令的非常有限的分页数量。然后,我将把这些RowIDs
加入到我的表中,并得到相关的结果。所以这实际上不是全文搜索而是过滤搜索。以这种方式获取RowIDs
非常快,从表中获得结果要比比较EntityIDs
和DateAdded
比较要快得多,尽管它们将被正确地编入索引。
发布于 2010-04-14 07:25:22
在SQL数据库中保存数据不会导致长期痛苦的唯一方法是实际创建一个正确、规范化的索引模式,并在向域对象添加新属性时根据需要扩展该模式。
请不要尝试将对象“序列化”到SQL数据库。如果这确实是您想要做的,那么最好使用对象数据库(如db4o )。
更新:
根据评论和问题更新,我目前是这样理解问题空间的:
我对此的选择,按优先次序排列如下:
我甚至不会在这里使用.NET BinaryFormatter
,我会创建自己的高度优化版本。毕竟,这需要快,快!而进入表中的每一个额外字节都会使查询速度变慢。您甚至可以通过GZip压缩一些数据,具体取决于其中的内容。
除非我还没有完全理解您的需求,否则我甚至不会考虑任何其他选择。
发布于 2010-04-14 07:22:26
不要这样做。这是个坏主意。
如果您真的必须这样做,我将使用XML。例如,Server允许您对XMl进行查询,只要该字段是XML类型。
从某种意义上说,您正在做的是面向对象数据库所做的事情。它们已经失宠了,因为ORM工具,比如Hibernate和Microsoft的实体框架( Entity ),在很大程度上允许你同时拥有OO和关系世界的精华。
发布于 2010-04-14 07:20:33
https://stackoverflow.com/questions/2638579
复制相似问题