我是數據庫的新手,我從未與任何RDBMS合作過。但是我得到關係數據庫的基本思想。至少我覺得我做的;-)關係與非關係數據建模 - 有什麼區別
比方說,我有一個用戶數據庫,每個用戶的以下屬性:
- 用戶
- ID
- 名
- 拉鍊
- 城市
在關係數據庫我想例如模型,可以在一臺名爲user
- 用戶
- ID
- 名
- LOCATION_ID
,並有第二個表稱爲location
- 位置
- ID
- 拉鍊
- 城市
而location_id
是對location
表中的條目的外鍵(參考)。如果我理解正確,這裏的優勢在於,如果某個城市的郵政編碼發生變化,我只需要更改一個條目。
因此,我們來看看非關係型數據庫,我開始使用Google App Engine。在這裏,我真的會模擬它,就像它在規格中首先寫下來一樣。我有一種user
:
class User(db.Model):
name = db.StringProperty()
zip = db.StringProperty()
city = db.StringProperty()
的好處是,我不需要連接兩個「表」,但缺點是,如果郵政編碼改變我要運行一個腳本,通過一切順利用戶輸入並更新郵政編碼,對嗎?
因此,現在Google App Engine中有另一種選擇,即使用ReferenceProperties
。我可以有兩種:user
和location
class Location(db.Model):
zip = db.StringProperty()
city = db.StringProperty()
class User(db.Model):
name = db.StringProperty()
location = db.ReferenceProperty(Location)
如果我沒看錯我現在有完全相同的模式,如上述的關係數據庫。我現在想知道的是,首先,這是錯誤的,我剛剛做了,並且這會破壞非關係數據庫的所有優點。我明白,爲了得到zip和城市的價值,我必須運行第二次查詢。但在另一種情況下,要更改郵政編碼,我必須通過所有現有用戶。
那麼在Google的數據存儲庫這樣的非關係數據庫中,這兩種建模可能性有什麼影響。對於它們兩者來說,典型的用例是什麼,這意味着什麼時候我應該使用一個,什麼時候使用另一個。
另外作爲一個額外的問題,如果在一個非關係數據庫中,我可以建模完全相同的模型在關係數據庫中,爲什麼我應該使用關係數據庫呢?
很抱歉,如果其中一些問題聽起來很樸素,但我相信他們會幫助一些對數據庫系統不熟悉的人加以幫助。
+1很好的答案。現在我想到了,我沒有意識到這一點。 – 2011-05-14 15:25:36
這正是我正要寫的。 :) – 2011-05-15 01:33:16