作用:設計的好,會清晰,且易於理解,後續開發也事半功倍,易於維護。
基本原則:
1. 一對一的表,兩表的屬性實際上完全可以合併成乙個表,共用乙個主鍵即可;
2. 一對多的表,可以設中間關聯表,也可以將關聯表併入「多」這頭;若設獨立關聯表,則可引入「多」這頭的主鍵作為其主鍵,也可另立主鍵並將「一」和「多」兩表的主鍵作為關聯表的外來鍵;
3. 多對多的表,則必須設中間關聯表,關聯表設獨立主鍵,並引入兩個「多」頭的表的主鍵作為關聯表的外來鍵。
4. 能用1對1的,就不用1對多;能用1對多的,就不用多對多,往簡單化方向靠;
5. 能當屬性處理的,盡量當屬性,而不是當實體處理去另立新表,這樣可使問題簡化。
6. 把意義相近聯絡緊密的屬性放在一張表內,而不是拆在多張表中。
foreignkey: 多對一
manytomanyfield:多對多
onetoonefield: 一對一
注 :要求第乙個引數是乙個模型類,需要使用verbose_name才能指定自述名。
廢話不多說,先來個簡單的模型例項:
class category(models.model):'''文章分類
'''name = models.charfield(max_length=20,verbose_name='文章類別')
number = models.integerfield(default=1,verbose_name='分類數目')
class tags(models.model):
'''文章標籤
'''name = models.charfield(max_length=20,verbose_name='文章標籤')
number = models.integerfield(default=1, verbose_name='標籤數目')
class blog(models.model):
'''部落格
'''title = models.charfield(max_length=100,verbose_name=u'標題')
content = models.textfield(default='',verbose_name=u'正文')
create_time = models.datetimefield(default=timezone.now,verbose_name=u'建立時間')
modify_time = models.datetimefield(auto_now=true,verbose_name=u'修改時間')
click_nums = models.integerfield(default=0,verbose_name=u'點選量')
category = models.foreignkey(category,on_delete=models.cascade,verbose_name=u'文章類別')
tags = models.manytomanyfield(tags,verbose_name=u'文章標籤')
class comment(models.model):
''''''
name = models.charfield(max_length=20,default=u'佚名',verbose_name=u'姓名')
content = models.textfield(verbose_name=u'內容')
create_time = models.datetimefield(auto_now_add=true,verbose_name=u'建立時間')
blog = models.foreignkey(blog,verbose_name=u'部落格')
class person(models.model):name = models.charfield(max_length=128)
class group(models.model):
name = models.charfield(max_length=128)
members = models.manytomanyfield(person, through='membership
')class membership(models.model):
person = models.foreignkey(person)
group = models.foreignkey(group)
date_joined = models.datefield()
invite_reason = models.charfield(max_length=64)
onetoone::當某個物件想擴充套件自另乙個物件,那可以再這個物件的主鍵上新增一對一的關係。例如:
class place(model.model):address=models.charfield()
phone=models.integer()
class restaurant(models.model):
place=models.onetoonefield(plase)
說明:這裡建立了乙個』place』資料庫,裡面有一些常用的字段,那接下來我想在已有基礎上新增』restaurant』資料庫,而且不想將已有的字段賦值到』restaurant』模型中,那我們可以新增onetoonefield欄位,指向』place』. (在這裡我們應該使用典型的繼承,它隱含了乙個一對一的關係)
總結:資料庫的這三種關係就是這麼簡單,但在運用的過程中,我們需要結合具體的需求,多對
多經常發生的情景是有標籤(tags)的時;onetoone(一對一):類似於繼承,在設計模型時,可以將多個資料路中共有的字段集中起來,然後使用onetoone,進行關聯。
MySQL關係 一對多 一對一 多對多
將實體與實體的關係,反應到最終資料庫表的設計上,將關係分為三種 一對一,一對多 多對一 和多對多,所有的關係都是表與表之間的關係 一對一 一對一 一張表的一條記錄只能與另外一條記錄進行對應,反之亦然 id p 姓名 性別 年齡 身高 婚姻狀況 籍貫 家庭位址 緊急聯絡人 體重 表設計成以上這種形式 ...
資料庫一對一,多對一,多對多的關係
關聯對映 一對多 多對一 存在最普遍的對映關係,簡單來講就如球員與球隊的關係 一對多 從球隊角度來說乙個球隊擁有多個球員 即為一對多 多對一 從球員角度來說多個球員屬於乙個球隊 即為多對一 資料表間一對多關係如下圖 關聯對映 一對一 一對一關係就如球隊與球隊所在位址之間的關係,一支球隊僅有乙個位址,...
Django入門 多對一模型
對於乙個初學者,當看到django中models使用多對一時,一臉的mb!q 為什麼要有一對 一 多對 一 多對多的模型?a 乙個系統中經常會有文章 資料等的對應關係,比如 乙個賬戶只有乙個使用者名稱 乙個賬戶對應這個使用者名稱,這個使用者名稱就是指這個賬戶 乙個作者發布了多個blog 知道這個作者...