資料庫中外鍵知識

2021-07-25 08:29:55 字數 1265 閱讀 2277

class tweet(db.model):

tablename= 『tweets』

… user_id = db.column(db.integer, db.foreignkey(『users.id』))

class user(db.model):

tablename= 『users』

… tweets = db.relationship(『tweet』, backref=』user』)

定義兩個類,乙個推特有乙個發推特的使用者,乙個使用者會發多個推特,所以要把推特和使用者關聯起來。

推特類的模型設計:

推特需要知道是誰發的,所以定義乙個user_id欄位,用來儲存user的id,這個字段就是外來鍵,用來關聯推特類和使用者類

傳給db.foreignkey()的 『users.id』 引數,就是表示user_id這個欄位為user.id的值,通過user_id就可以查詢這是由哪個id發的推特。

使用者類的模型設計:

tweets = db.relationship(『tweet』, backref=』user』)

relationship表明它不是乙個字段,而是user類的乙個屬性,user類表中沒有tweets這個字段,db.relationship()中第乙個引數 『tweets』 是類名,表示關係的另一端是tweets類,對於乙個user類的例項(某乙個使用者),呼叫tweets屬性,將根據該使用者的id(對應tweets類裡面的user_id欄位)查詢並返回所有推特。

db.relationship() 中的 backref 反向應用表示向tweet類模型新增乙個user屬性,來實現反向引用,這一屬性和 user_id 都可以訪問 user 模型, 不同的是前者獲取的是類模型例項物件, 而後者獲取的是外來鍵的值。

假設:

u = user()

t = tweet()

u 的 username 是 『xd』 , u 的 id 是 3

使用者』xd』 發了10條推特

t 是 『xd』 發的第5條推特, 內容是』666』

那麼:

u.tweets 將以列表形式返回使用者 『xd』 的10條推特

t.content 將返回 '666'

t.user_id 將返回這條推特的使用者的 id 也就是3, 但並不知道發推使用者的名字

t.user 將返回這條推特的使用者例項 u, t.user.username 就可以獲得使用者的名字

資料庫中外鍵的作用

為了一張表記錄的資料不要太過冗餘。這和軟體工程的模組化思想差不多類似,只不過在資料庫中是對錶關係進行解耦,盡量讓表 記錄的資料單一化。就如你貼的中,把成績和學生資訊放在一張表中就太冗餘了,成績完全可以以學生的id作為區分標識。你想想,你的圖中的第一章表分割成了表1和表2,表2的學號引用了表1的學號字...

資料庫中外鍵的作用以及和主鍵的區別

外來鍵是資料庫一級的乙個完整性約束,就是資料庫基礎理論書中所說的 參照完整性 的資料庫實現方式。外來鍵屬性當然是可以去掉的,如果你不想再用這種約束,對程式設計當然不會有什麼影響,但相應的錄入資料的時候就不對錄入的資料進行 參照完整性 檢查了。例如有兩個表 a a,b a為主鍵,b為外來鍵 來自於b....

(基礎知識)Oracle中外鍵不加索引?

oracle中外鍵不加索引可能會導致3個問題,這裡的外來鍵包括oracle所有種類的外來鍵 普通外來鍵 級聯外來鍵和置空外來鍵 1。1.死鎖以及併發問題。對於父表的delete update操作都會導致子表鎖定 表級鎖 這指的是發起指令到指令結束這一段過程中,會鎖表。這個全表鎖可能會導致死鎖2,以及...