簡體   English   中英

具有用戶數據和中央數據庫更新的數據庫設計

[英]Database design with user data and central database updates

我正在設計Windows桌面應用程序。 它使用LiteDB作為用戶的單個文件本地數據庫-非常用作具有外鍵等的關系數據庫(每個表都具有整數ID作為主鍵,並通過FK整數引用其他表)。

這是一款復古游戲應用程序,因此“表”將包含以下內容:

系統(例如“ Sony PlayStation”,“ Nintendo 64”)

控制器(例如“ Sony Dual Shock”)

控制(例如“交叉”,“開始”,“選擇”)

由於上述原因,我將不得不堅持使用整數ID作為主鍵-盡管我使用的是“名稱”,但這對控件不起作用(即,在許多控制器上都可以找到Start)。

用戶應該能夠根據需要添加和刪除記錄(盡管不鼓勵刪除“標准”)

挑戰在於,我還將在服務器上托管一個mysql數據庫,從而允許用戶從中更新其表。 現在這是我無法理解的地方。

假設他們在本地表中添加了系統“ Casio Watch”。 這將獲得一個自動生成的ID(例如“ 94”)。 同時,服務器數據庫上會發生一些更新,並添加了一個新系統(例如“ Commodore Calculator”),這也會獲得自動生成ID“ 94”。 這是沖突編號1。

您可以通過將其附加為用戶數據庫中的新行來解決上述問題-在其中獲得新的ID。 但是我的第二個擔心是關於外鍵。 假設有一個帶有“最大賣方”字段的“制造商”表。 現在在服務器上,對於Manufacturer = Commodore,“ Commodore Calculator”的“最大賣方” FK為94。但是,如果將此Manufacturer表導入用戶本地數據庫,則Commodore的最大賣方將是“ Casio watch”-它的ID在用戶數據庫上為94。

原諒我,如果我對所有這些事情都有點慢的話。 即將出現參照完整性(是在更改時具有更新/空FK的引用?),但我認為您無法通過LiteDB做到這一點(即,其中的更改不會級聯到相關表)。

任何建議將不勝感激。

正如您已准確指出的那樣,使用簡單的自動增量字段將無效。

在相關表中添加“服務器ID”字段,以標識數據來自的計算機/安裝,並確保該字段在所有安裝中都是唯一的。 您需要在多個數據庫之間進行同步的每個系統/制造商/等都將具有由服務器ID和自動遞增值組成的復合主鍵(盡管您可能需要具有單獨的生成器才能在本地創建自動遞增)。 因此,“ Casio Watch”的服務器ID為1,自動遞增值為94。“ Commodore Calculator”將具有相同的自動增量值,但其服務器ID將不同,因此不會發生沖突。

另一種選擇是使用通用唯一ID(UUID),而不是簡單的自動增量字段。 UUID保證在所有mysql安裝中都是唯一的(有一些限制)。 在mysql中,您可以使用uuid()函數生成一個uuid。

從系統設計的角度來看,UUID更簡單,因為mysql在上述鏈接中描述的某些限制內保證了其唯一性。 但是,UUID需要更多的存儲空間,並且會對innodb的性能產生負面影響

暫無
暫無

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

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