Database-Design
具有 1000 列的 sqlite 數據庫表
我在應用程序中使用 sqlite3 來分析點集之間的距離。這些點之間的距離已使用 dijkstra 的算法預先計算,並給我留下瞭如下表格:
point | p0 p1 p2 ... p1500 ------|-------------------------- p0 | 0 100 15 ... X p1 | 100 0 10 ... Y p2 | 15 10 0 ... Z p150 | X Y Z ... 0
我將在桌子上做很多 I/O。對於成千上萬條記錄,我需要查找一組點。結合其他因素並確定哪個點最適合該記錄。然後重複。
我的問題是……就數據庫(尤其是 sqlite)的性能而言,將表保持原樣或將表轉換為長格式會更好嗎?
aPoint bPoint | dist --------------|----- p0 p0 | 0 p0 p1 | 100 p0 p2 | 15 p0 p1500 | X p1 p0 | 100 p1 p1 | 0 p1 p2 | 10 p1 p1500 | Y p2 p0 | 15 p2 p1 | 10 p2 p2 | 0 p2 p1500 | Z p1500 p0 | X p1500 p1 | Y p1500 p2 | Z p1500 p1500 | 0
儘管您使用的是數據庫,但通常您不會將數千個欄位添加到表中。您的第二個模型更加“標準化”(並且很容易索引),並且應該更好地工作(無論如何我不是專家)。我的意見是基於數據庫的正常限制,這並不意味著以這種方式工作,因此您將達到引擎的某些內部限制,或者誤用引擎的設計用途。
您可以探索更現代版本的 mysql、MariaDB 和其他版本的函式和數據類型,這些版本已經定義了點和類似的類型。
對於第二個範例,這將數據量減少了一半,並且您不會在“反向”條目上出錯。在應用程序中檢查
A <= B
插入之前,如果沒有,則交換。字典比較是可以的。請記住調整查詢。-- Distance from point PT_A to -- point PT_B is DIST. -- pt_dist {PT_A, PT_B, DIST} PK {PT_A, PT_B} CHECK (PT_A <= PT_B)