2014-04-01 69 views
1

我們有一個應用程序,我們需要返回許多結果,並且每個結果可以與許多不同的屬性關聯,這些屬性可能很複雜。如何爲返回不同類型的數據的查詢設計SQL模式

爲了解釋這個問題,讓我描述一個滿足要求的可能設計。

A.創建一個表,其中包含列是複雜屬性的外鍵列。

CREATE TABLE Results 
(
    Id int NOT NULL, 
    UserId int NULL, 
    DataForTable1Id int NULL, 
    DataForTable2Id int NULL, 
    DataForTable3Id int NULL, 
    DataForTable4Id int NULL, 
    DataForTable5Id int NULL, 
    DataForTable6Id int NULL, 
    DataForTable7Id int NULL, 
    DataForTable8Id int NULL, 
    DataForTable9Id int NULL 
) 

B.此外,每個複雜屬性也可能與其他複雜屬性相關聯。例如,DataForTable1可能看起來像:

CREATE TABLE DataForTable1 
(
    Id int NOT NULL, 
    UserId1 int NULL, 
    UserId2 int NULL, 
) 

C.每個複雜性創建一個單獨的查詢,如:

SELECT * 
FROM 
    Table1 t 
    JOIN Results r on t.Id = r.DataForTable1Id 
    LEFT JOIN Users u1 on r.UserId1 = u1.Id 
    LEFT JOIN Users u2 on r.UserId2 = u2.Id` 

這將解決這個問題,但需要執行一個單獨的查詢每個複雜的財產。當有很多結果時,這將不會理想地執行,尤其是隨着越來越複雜的屬性的添加。

此外,表格DataForTable1,DataForTable2等是需要在此需求之外的系統中存在的表格。例如,這些表格可能代表應用程序之外的用戶或其他對象。

我想知道如果別人正在解決類似的問題,如果是的話,他們是如何做到這一點。它可能來自以下任何內容:「我將如何設計我的表格」,「停止使用關係數據庫,以下是您應該使用的內容......」。

任何建議,將不勝感激。

感謝, 埃裏克

+0

您正在使用哪些DBMS?在Postgres中,'hstore'看起來很合適 –

回答

1

我不會用關係數據庫管理系統這一點。我會選擇使用像Neo4j這樣的圖形數據庫。您系統中的每個屬性都將表示爲圖中的節點。並且每個關聯都將表示爲圖形數據庫中的邊。然後,您可以使用Cypher查詢語言獲取數據庫中的任何關係/關聯。圖表數據庫非常適合於表示這些類型的關係/關聯,這些關係/關聯有時很難在關係數據庫中建模。

相關問題