Database-Design

具有 1000 列的 sqlite 數據庫表

  • April 26, 2020

我在應用程序中使用 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)

引用自:https://dba.stackexchange.com/questions/127231