2011-04-06 50 views
1

我有一種情況,我需要存儲一些數據,這些數據不會......真正適合數據庫表。這有點太抽象了,我沒有足夠的知識來分解它,以致它可以分解成表格和列。有問題的對象是System.Linq.Expressions.Expression<T>是否可以在數據庫中使用反序列化的文件引用?

我發現使用MetaLinq這種序列化到XML的一種手段。它運行得非常好,雖然它產生的xml過於肥胖,但我有點期待這很像表達式那樣複雜。一個溫和的表達結果約19 kb。

所以我的想法是對文件使用gzip壓縮。這工作得很好,它可以節省大約2kb。

那麼,我的實際問題是:這是不好的做法或「危險」的做法基本上是使用一個表列引用的文件名反序列化的對象?就像我會有一個表格表,它會有一個文件名,當表達式被調用時它會執行gzip解壓縮,反序列化它,並返回對象。

這似乎是一個理想的解決方案,但它需要大量的文件I/O和很多不同的壓縮/荏苒/系列化的。我想知道如果我能得到更有經驗的數據庫管理員的意見。我正在使用Fluent nHibernate作爲我的ORM映射器。

MetaLinq on codeplex

+1

甲骨文實際上允許一個通過[BFILE數據類型](http://www.dba-oracle.com/t_bfile_external_lob.htm)引用外部文件中的表。 AFAIK SQL Server不執行此操作;但您應該注意到通過[XML Data Type](http://msdn.microsoft.com/zh-cn/library/ms189887.aspx)將XML數據存儲到表中是完全可能的。 – rsenna 2011-04-06 18:19:00

+1

@rsenna:謝天謝地,自SQL Server 2008以來,MSSQL提供了一個像Oracle的BFILE數據類型的系統。在MSSQL的情況下,它通過[FILESTREAM](http://msdn.microsoft.com/en-us/library/cc949109.aspx)完成。最好的部分是,您可以通過T-SQL或直接通過SMB **和**訪問它,備份數據庫時將備份它。 – Joshua 2011-04-06 20:23:54

+0

@Joshua:謝謝你的信息,不知道。 – rsenna 2011-04-07 16:11:32

回答

1

取決於數據的大小。

Sql現在具有表格列的XML數據類型。因此,您可以反序列化對象,然後根據大小再次將整個對象插入列中。

但是如果你必須使用文件系統I將存儲的路徑,並在列中的文件名。 在你的程序的app.config保持驅動像\\ MyDrive或d根:\

這樣,如果信息的動作,只是改變了應用程序配置,只要在文件夾/文件結構保持不變。

編輯: 除了NerdFury的建議,如果你不需要「查看」數據庫中的數據,你可以使用二進制串行器。 XML序列至少使得可讀

+0

二進制序列化是我的第一次嘗試,實際上 - 但是我沒有成功將結構序列化爲二進制。 – Ciel 2011-04-06 18:19:59

+0

如果我把它放在XML中,我會關心它的大小。對於xml字段,19 kb認爲太大? – Ciel 2011-04-06 19:37:51

+0

是的。從數據空間的角度看我的十大表,而不是行,看起來最大的是每行1.05 kb。 – Mike 2011-04-06 19:44:23

2

不是一個有經驗的DBA,但我會存儲在數據庫中的BLOB字段序列化的數據。如果數據依賴的文件消失,反之亦然,則數據庫備份不起作用。我認爲這會簡化一切,把它們放在一起。由於您存儲的數據不需要查詢,所以blob可以正常工作。

+0

這將如何與gzip壓縮一起工作?或者我需要放棄壓縮而贊成以這種方式存儲它? – Ciel 2011-04-06 18:18:16

+0

@Ciel - 不知道你在用什麼做壓縮,但只要你能得到一個字節數組,你可以將它存儲在BLOB中。所以我想你可以將它插入gzip表格中。我知道.NET框架支持可以壓縮壓縮的流,但我從來沒有使用它。但基於它是一個流的事實,你可以很容易地從中獲得一個字節數組。 – NerdFury 2011-04-06 18:25:14

+0

@Ciel,@NerdFury - 我已經使用.Net中的GZip流類將二進制數據存儲在Oracle數據庫中。第一個技巧是包裝流 - 所以你有一個支持MemoryStream,並GZip流超過了這一點,訣竅是你必須'.Flush()'*和*'.Close()'GZip流到讓它寫入流的結尾。一旦你這樣做,使用底層MemoryStream的'.ToArray()'方法來獲取BLOB列的壓縮位。解壓縮只是在做相反的事情:) – Joshua 2011-04-06 18:49:59

相關問題