2011-12-09 34 views
2

我在開發一段數據庫模式時遇到了問題。目前,我的應用程序有一個用戶表和另一個事件表。我可以很容易地建立多對多的關係(使用第三個表格)來保存關於哪些用戶參加哪些事件的信息。具有大量不同表格的多對多關係

我的問題是,事件只是我的應用程序的一個功能。目標是讓用戶可以參與大量不同的程序,並且每個程序都需要自己的表格。但我仍然需要能夠調出用戶註冊的所有內容。

現在,我想從每個事件表反饋給用戶剛做的一種方式的關係。然後,我需要創建一個自定義函數(在我的網站ORM中),它可以獨立查詢每個表並組裝完整列表。我覺得這會很慢,所以我也開始創建一個單獨的表格,這個表格只列出用戶註冊的所有程序,並在那裏存儲我的應用程序運行所需的信息。這會重複我的數據庫中的信息,並且通常聽起來不「乾淨」,但可能會更快。

任何關於處理這種關係的最佳方式的建議?

P.S.如果它很重要,我使用Doctrine2 & Symfony2來驅動我的網站。

+0

我的回答合適嗎? –

+0

不是真的。我需要ale來與SQL中的所有數據進行交互 – MrGlass

+0

你是什麼意思?也許我們可以明天開始聊天頻道並討論? –

回答

1

除非你有類型的事件可笑的金額,查詢用戶從幾桌簽署了事件不應該比從所有事件的一個長表查詢同樣的事情慢得多。

我會採取這種方法,每個表或集合具有映射回用戶表中的user_id字段。你不需要真的在ORM中創建一個單獨的函數。如果每個事件類型都從一個事件類繼承,那麼您可以通過user_id找到所有事件。

+0

發佈時,我計劃有10種不同的事件類型。隨着時間的推移,我會增加更多。我敢肯定,10個查詢將運行比1個大型查詢慢很多。而且,儘管它們都擴展了一個事件類,但它們都將完全獨立存儲在數據庫中,所以從事件類查詢將不會工作(除非我進行自定義查詢) – MrGlass

2

這些事件類型有哪些獨特之處,需要他們擁有自己的表格?

如果對象是如此的本質上的不同,使物體儘量簡單,只有共同所有活動的那些事:...

public Event 
{ 
    public Guid Id; 
    public string Title; 
    public DateTime Date; 
    public string Type; 
    public string TypeSpecificData; // serialized JSON/XML 
} 

// Not derived from Event, but built from it. 
public SpecialEventType 
{ 
    public Guid Id; 
    // ... and the other common props from Event 

    // some kind of special prop parsed from the Event's serialized data 
    public string SpecialField; 
} 

「類型特定的數據」可能被用來存儲有關不共同事件的詳細信息(通常需要列或新表)...做一些類似於序列化XML或JSON的事情

將表MTM映射到Users表,並通過基本事件屬性和它的類型。

你的代碼,然後負責使用Type屬性,你與它相關聯的一些預定義的XML模式解析數據。

很簡單,讓你的數據庫非常乾淨,而且速度快,最大限度地減少往返。這裏的權衡是,你沒有能力查詢數據庫的具體事件類型...但對於大型擴展應用程序,具有成熟的ORM層,性能權衡是值得的......

例如,你現在查詢數據一次特定類型的活動,從它建立自己的僞派生類型,然後在「查詢」他們使用LINQ。

+0

不錯。我的事件類型可能非常複雜。事件實際上更多的是一個代碼字。我認爲他們是理想的完全即插即用的應用程序,用戶可以將其添加到他們的帳戶,如Facebook應用程序。 – MrGlass

+0

謝謝。嘗試使用MongoDB(「無sql」文檔數據庫)。它適用於這樣的事情,特別是如果你對JSON感到滿意並希望大規模擴展。我沒有什麼專業知識,但很容易爲您編寫一個存儲庫,並使用您的對象將您保留在C#域中,而不是一天一天地「架構」數據庫模式。 –

+0

不是JSON的忠實粉絲,我實際上使用了一個ORM,它可以讓我在PHP中完成所有這些工作。儘管如此,我可能不得不在一段時間內做一些真正的SQL查詢。哦,我的開始。不過我一直聽說mongoDB,可能會在深入之前仔細研究它。 – MrGlass

5

在我的Web應用程序之一,我已經使用了這種結構的存儲意見對於具有整數作爲主鍵的任何表:

CREATE TABLE Comments (
    Table VARCHAR(24) NOT NULL, 
    RowID BIGINT NOT NULL, 
    Comments VARCHAR(2000) NOT NULL, 
    PRIMARY KEY (TABLE, RowID, COMMENTS) 
); 

在我的情況(DB2,不到10萬行在評論表中)表現良好。 所以,把它應用到你的情況:

CREATE TABLE Registration (
    Table VARCHAR(24) NOT NULL, 
    RowID BIGINT NOT NULL, 
    User <datatype> NOT NULL, 
    Signup TIMESTAMP NOT NULL, 
    PRIMARY KEY (TABLE, RowID, User) 
); 

因此,「表」列標識包含程序(比如說,「活動」表)表。 'RowID'是該表中的主鍵(例如'Events'表中的條目的PK)。爲了表現良好,這需要在所有目標表中具有相同數據類型的主鍵。

NoSQL解決方案很酷,但上面的模式在普通的舊關係型數據庫中工作。