Database-Design

如何處理可能有多個別名的人?

  • July 24, 2020

我正在設計一個 neo4j 數據庫,主要用於儲存有關人員的資訊。要求之一是它必須能夠儲存一個人的別名。

我在決定如何設計我的數據庫以處理具有多個別名的人時遇到了麻煩?

我有兩個解決方案:

  1. 將人員別名儲存在單個欄位中,以逗號分隔。這很簡單,但使查詢變得困難。
  2. 將個人別名儲存在名為alias. 這似乎過於復雜,但比選項 1 更容易查詢。

如果有的話,哪一個是問題的正確答案?或者,有沒有我忽略的更好的解決方案?

選項 2 是圖形數據庫的正確方法,特別是如果 :Alias 節點都指向具有該別名的 :Person 節點(或用於區分人員條目和別名的任何標籤)。:Person 節點本身也可以有一個 :Alias 標籤,允許在執行查詢時也考慮其名稱屬性。

例如,如果您有這樣的圖表:

(:Alias {name:'Joe Shmoe'})-[:ALIAS_FOR]->(joe:Person:Alias {name:'Joe Jackson'})
(:Alias {name:'Joe Anybody'})-[:ALIAS_FOR]->(joe)
(:Alias {name:'Joseph Jones'})-[:ALIAS_FOR]->(joe)

然後您可以使用 $alias 參數發出查詢,例如:

MATCH (:Alias {name:$alias})-[:ALIAS_FOR*0..1]->(person:Person)
RETURN person

您應該在 :Alias(name) 上有一個索引以便快速查找,這允許查找人員的姓名或與他們關聯的任何別名(記住他們的 :Person 節點也是一個 :Alias 節點,所以這也會匹配)。

如果您需要進行不區分大小寫的搜尋或跨多個欄位的搜尋,那麼您可能需要考慮利用Neo4j 3.5.x 中引入的全文模式索引

您是否需要擷取別名的類型,例如婚前姓名、出生姓名(即婚前姓名或性別改變前的姓名)、暱稱、通信的首選名稱(假設人們用他們的名字來稱呼是不好的) ,犯罪別名等?如果這樣,逗號分隔將不起作用。

如果您的類別數量有限並且知道您不會添加任何類別,那麼您可以使用單獨的欄位。對某些目的更容易,但對另一些目的更難。

您的選項 2 是“正確的方式”,但它使一些查詢或數據輸入表格有點混亂。我建議確保您的別名或別名/類型組合是唯一的。

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