2011-08-23 13 views
2

這可能聽起來像一個管道夢,我想知道是否有可能。我希望能夠使用名爲info的C#動態對象,並將其保存到數據庫(我目前在SQL Server 2008數據庫中)。什麼是堅持一個動態的「信息」對象,C#/。NET MVC/SQL Server 2008的最佳方式?

的信息對象,是動態的,可以有任意數量的屬性:Id, Title, Content, DateExpires, DateAdded, Dateupdated, TypeOf,等...

它的每個實例都可以/將包含不同性質的數量,這取決於該實例用於:博客文章,分類廣告,事件等......但是,每個信息對象將會共享一組核心屬性:Id, MemberId, TypeOf ...

這個想法是,有一箇中央表格,它可以存儲所有的動態信息對象,但是,允許我根據任何屬性(某些對象可能不存在)進行查詢。

例如,博客文章。他們有:Id, MemberId, DateAdded, Title, Content, TypeOf,等...一個事件將有:Id, MemberId, Title, Content, TypeOf, DateOf, Recurrance, MinAge, MaxAge,等...

我想建立基於任何給定的信息對象屬性的查詢。

爲什麼?靈活性。如果我可以得到這個工作,我可以在我的web應用程序中使用info對象作爲未來的案例。如果這是一個非常糟糕的主意,請讓我知道(以及爲什麼)。謝謝!

+0

看一下Massive,它是由Rob Conery編寫的一個工具,你可以做的就是讓你的表格基礎,然後把對象讀回到動態類中,這有點倒退到你計劃的方式儘管如此。但它聽起來可能。 – Jethro

+0

您可以始終擁有一個「核心」屬性爲「普通」列(幾乎所有對象都存在的列)的表,然後將其餘屬性存儲到SQL Server表中的XML結構中...... –

+0

@ Jethro有趣的提到Massive,我目前使用Massive來訪問我的應用中的數據。 ;)但是,我必須爲每個可能的屬性創建一個單獨的字段......除非我錯過了某種技術? – Chaddeus

回答

2

這是可能的,我見過很多像這樣構建的系統......但是由於這種「通用性」,這些系統通常是最難維護的。這種方法本身並沒有錯誤。只是要把它拉下來很困難,而且在大多數情況下,它最終會變得執行不力。

近年來,非關係數據庫(如@Marc Gravell提到的文檔數據庫)已經迎頭趕上,它們對於某些領域非常有用,但您需要確保它適合您的項目。

當你走上構建這個「通用數據庫」的道路時,你正在犧牲我們認爲理所當然的其他衆所周知的技術。例如關係數據庫中的數據庫優化是衆所周知的,並且有很多工具可以很好地與它們一起工作。如果你突然轉向不同的路徑,那麼你習慣的工具可能無法工作,並最終會自行構建自己的工具以彌補不起作用的東西(或者購買/選擇一些深奧的工具)。

根據項目的規模,建立一個或兩個您認爲常見的系統可能是明智的,然後嘗試查看它們是否與您想象的一樣常見。

+0

我認爲你是對的赫克托爾。我越深入地計劃/思考這個問題,我發現的越多令人頭疼。我想我會放棄這個想法。 ;) – Chaddeus

0

您可以使用「基本」表作爲常用屬性,併爲其他屬性使用屬性名稱 - 值表。含義:

Table Info 
    int Id (PK) (FK), 
    int MemberId, 
    Date DateAdded //etc... 

Table Properties 
    int InfoId (PK), 
    varchar PropertyName (PK), 
    varchar PropertyValue, 
    string PropertyType //optionaly store information about the type of property 

查詢後,可以使用反射將屬性從(名稱,值)對轉換爲適當的屬性。

這麼說,我認爲這是一個非常糟糕的主意,有以下幾個原因:
1.這對您的CRUD邏輯造成進一步的複雜性你沒有明確定義的
2.實體您域模型,我不喜歡
3.驗證更困難 - 您必須手動驗證Post,例如,沒有名爲Recurrance的屬性字段。

只有在您真的需要需要時,我纔會使用此方法,例如:如果用戶可以選擇保存您事先不知道的自定義屬性。否則,如果您知道您的實體僅限於PostEventEmployee等,我只能將自己限制在該範圍內。

+1

請參見[10個常見數據庫設計錯誤](http://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/) - 點號。 9和[您應該避免的五個簡單數據庫設計錯誤](http://www.simple-talk.com/sql/database-administration/five-simple--database-design-errors-you-should-avoid/)沒有。 3 - 這種反模式被稱爲實體 - 屬性值表(EAV表),並且非常難以使用和低效查詢 –

+0

@marc_s:謝謝!這是另一個原因*不*做乍得建議的...... –

相關問題