簡體   English   中英

vcard與sql-table進行聯系

[英]vcard vs sql-table for contacts

前幾天,我在查看SOGo SQL表時,發現記錄存儲為vcard數據,而不是具有不同列(如姓氏,電話號碼等)的精細表。

盡管有一個我期望的名為sogo_quick_contacts的表,但並不是所有的列都在那兒,只有一些基本的列。

我想知道為什么會這樣嗎? 用整個vcard數據查詢記錄並提取我需要的信息更好嗎? 應用SELECT查詢指示我正在尋找的某些列(如果可用)會更好(更快)嗎?

CardDav似乎提供了此vcard數據,它們更適合聯系人查找嗎,為什么?

如果我只想列出姓名和生日該怎么辦。 是否會比使用SQL Query提取所有vcard的速度慢得多,在SQL Query中我將所有內容拆分為不同的列?

在可伸縮OGo數據庫模式的設計方式中,有很多因素起作用。 哪個BTW是我設計的;-)

我認為這里的核心是專門為兩種類型的客戶端設計的:a)本地CardDAV客戶端(macOS / iOS聯系人,Thunderbird)和b)可擴展OGo Web界面。

本機客戶端基本上從不執行您要查詢的查詢類型。 他們總是將完整的vCard同步到其本地緩存。 因此,必須有一種快速的方法來存儲和檢索完整的vCard,這是針對服務器的最常見操作。

2003年的Web客戶端(我想那是我寫原始Web客戶端的那段時間)尚不具備在本地存儲完整對象的能力,因此只能執行您要求的操作:僅查詢Web客戶端需要處理的字段顯示在相應頁面上。 這就是“快速”表的用途。 它們包含Web客戶端顯示概述等所需的列。 本質上,它是由應用服務器提供的vCard內容索引。

這應該是您問題的主要答案。

同樣還有其他原因,其中一些原因沒有特定的順序:

  • vCard非常復雜,要將其轉換為適當的SQL模式/對其進行規范化(當時是,但這仍然很重要,因為在過去15年中系統規模增長了100倍)因此,只需將BLOB流式傳輸到磁盤即可。
  • CardDAV服務器應該按字節原樣存儲完整的vCard。 這樣客戶端可以執行受ETag保護的請求。 並存儲自定義字段(所有客戶端將自己的X-標簽用於客戶端特定的字段)
  • 快速表也已設置,以便可以異步構建它們,盡管我認為該功能從未在SOGo中實現。 如果客戶端快速將10000個vCard加載到服務器中(例如,僅使用Finder將vCard拖動到服務器中),則服務器可以在后台批量更新快速表。 從vCard到DB的轉換不必實時進行。
  • (特別是本地客戶端通常在本地具有類似的“快速”表設置。)

希望這可以幫助。 也許有人會在2017年設計出一些與眾不同的東西,盡管我認為基本思想仍然合理;-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM