2010-06-02 78 views
2

我正在存儲一些非常基本的信息「數據源」進入我的應用程序。這些數據源可以是文檔(例如PDF等),音頻(例如MP3等)或視頻(例如AVI等)的形式。比方說,我只對數據源的文件名感興趣。因此,我有下表:具有屬性的實體的數據建模

DataSource 
Id (PK) 
Filename 

對於每個數據源,我還需要存儲它的一些屬性。 PDF示例將是「頁數」。音頻示例將是「比特率」。視頻示例將是「持續時間」。每個DataSource對於需要存儲的屬性都有不同的要求。所以,我仿照「數據源屬性」是這樣的:

DataSourceAttribute 
Id (PK) 
DataSourceId (FK) 
Name 
Value 

因此,我會像這樣的記錄:

DataSource->Id = 1 
DataSource->Filename = 'mydoc.pdf' 

DataSource->Id = 2 
DataSource->Filename = 'mysong.mp3' 

DataSource->Id = 3 
DataSource->Filename = 'myvideo.avi' 

DataSourceAttribute->Id = 1 
DataSourceAttribute->DataSourceId = 1 
DataSourceAttribute->Name = 'TotalPages' 
DataSourceAttribute->Value = '10' 

DataSourceAttribute->Id = 2 
DataSourceAttribute->DataSourceId = 2 
DataSourceAttribute->Name = 'BitRate' 
DataSourceAttribute->Value '16' 

DataSourceAttribute->Id = 3 
DataSourceAttribute->DataSourceId = 3 
DataSourceAttribute->Name = 'Duration' 
DataSourceAttribute->Value = '1:32' 

我的問題是,這似乎並沒有成比例的。例如,說我需要爲所有的PDF文檔與thier總頁數以及查詢:

Filename, TotalPages 
'mydoc.pdf', '10' 
'myotherdoc.pdf', '23' 
... 

的加入需要產生以上結果實在太昂貴。我應該如何解決這個問題?

回答

0

縮放是與EAV(實體 - 屬性 - 值)的數據結構中最常見的問題之一。總之,你必須要求元數據(即找到屬性)來獲取數據。然而,這裏是一個查詢,你可以用它來得到你想要的數據:

Select DataSourceId 
    , Min(Case When Name = 'TotalPages' Then Value End) As TotalPages 
    , Min(Case When Name = 'BitRate' Then Value End) As BitRate 
    , Min(Case When Name = 'Duration' Then Vlaue End) As Duration 
From DataSourceAttribute 
Group By DataSourceId 

爲了提高性能,你會想在的DataSourceID的指數,或許命名爲好。要獲得您發佈的結果,您應該這樣做:

Select DataSource.FileName 
    , Min(Case When DataSourceAttribute.Name = 'TotalPages' Then Value End) As TotalPages 
    , Min(Case When DataSourceAttribute.Name = 'BitRate' Then Value End) As BitRate 
    , Min(Case When DataSourceAttribute.Name = 'Duration' Then Vlaue End) As Duration 
From DataSourceAttribute 
    Join DataSource 
     On DataSource.Id = DataSourceAttribute.DataSourceId 
Group By DataSource.FileName 
0

看起來好像你想要的東西比典型的關係數據庫更有損失。聽起來像是LuceneMongoDB的好候選人。 Lucene是一個索引引擎,它允許存儲和索引任何類型的文檔。 MongoDB處於RDBMS和自由格式文檔存儲之間。 JSON以某種形式或其他(MongoDB就是一個很好的例子)應該很好地適應。

+0

我不確定是否準備嚮應用程序中引入其他技術。現在,我想通過適當的數據建模來解決這個問題。 – StackOverflowNewbie 2010-06-02 23:04:42

0

這可能會實現,但定義過於昂貴...

select 
datasource.id, 
d1.id as d1id, 
d1.value as d1filename, 
d2.id as d2id, 
d2.value as d2totalpages 

from datasource 
inner join datasourceattribute d1 
on datasource.id = d1.datasourceid and d1.name = 'filename' 
inner join datasourceattribute d2 
on datasource.id = d2.datasourceid and d2.name = 'totalpages' 
having d1filename like '%pdf' 
+0

@Zak:我的查詢基本上和你的一樣。我跑了388個查詢,執行了255.7976秒。對於如此少量的記錄,這已經超過4分鐘了,不是嗎? – StackOverflowNewbie 2010-06-02 23:09:36

+0

你的表格索引是什麼樣的? – Zak 2010-06-02 23:11:16

+0

也,前綴這個查詢與「解釋」,然後在你的命令行中運行,然後發佈結果... – Zak 2010-06-02 23:12:03

相關問題