2010-03-31 75 views
0

我有2個表,他們的行有一對一的關係.. 爲了你瞭解的情況,假設有一個表用戶信息 ,還有另一個表包含一個非常具體的信息,每個用戶只能鏈接到一個這些特定類型的信息(假設第二個表爲字符)One on One table關係 - 在兩個表中保持關係有害嗎?

並且該字符只能分配給抓取它的用戶,它是否違反了設計清潔數據庫以將關係鍵保存在兩個表中的規則?

用戶表:USER_ID,姓名,年齡,character_id

字符表:character_id,形狀,user_id說明

我必須這樣做的性能,您怎麼看呢?

+0

爲什麼你需要將兩張桌子分開? – 2010-03-31 16:24:16

+0

有無限數量的字符和用戶!它們並不相同,用戶必須在字符數據庫中搜索並找到他喜歡的一個! – EBAG 2010-03-31 16:25:15

回答

2

是的,我會說這是對設計乾淨數據庫的規則,你有數據重複,因此你必須積極維護兩套數據在所有時間害怕他們不同步。如果你不這樣做,你不能相信這些數據。 :)

作爲一個方面說明:你說你出於性能原因這麼做?你看到了什麼好處?不管你從哪個表訪問數據,你都應該找到(使用合適的索引),它們之間幾乎沒有什麼區別?這可能是你在這裏修正了錯誤的問題,也許還有其他事情要先看看(如索引,改進你的查詢等)。

編輯:選擇免費的字符應該是很容易的,你會得到從用戶表擺脫character_id的,只有在人物一個user_id

Users: user_id, name, age 
Characters: character_id, shape, user_id 

那麼你就能夠做到一些像這些查詢:

//something like this to query for free characters. 
SELECT * FROM characters WHERE user_id IS NULL; 

// To access a list of a users characters, you could do something like this: 
SELECT * FROM characters WHERE user_id = 42; 

// More information about the user, while still grabbing character info. 
SELECT * FROM characters AS c INNER JOIN users AS u ON u.user_id = c.user_id WHERE u.user_id = 42; 

或者是有更多關於您的模型,我可能錯過了這個? (因爲我不假裝知道你的數據庫佈局;))。我假設一對多的關係,因爲它似乎是這樣的(一個用戶可以有很多字符)。

+1

如果我想找到免費角色怎麼辦? select * from character where character_id not in(從character_id =%d的用戶中選擇character_id) – EBAG 2010-03-31 16:29:07

+0

不,你是完全正確的! :D – EBAG 2010-03-31 16:38:19

+0

已更新的回答來嘗試和澄清替代方案。我不知道我是否遇到過批評,儘管我肯定不打算。 :)只是試圖提出一個問題或兩個在你的腦海中,因爲你知道你的情況更好:) – Amadiere 2010-03-31 16:40:01

6

在1:1關係中仍然應該有一條記錄被認爲是「父母」。

在這種情況下,我會考慮用戶是分層以上字符,所以只能用在character表的外鍵。

2

兩個原因:

  • 冗餘數據
  • 需要保持兩個表總是正確的鍵更新中...

我會看的原因,性能問題,因爲這是一個1:1的關係,你會得到一個記錄很快,當你在PK加盟:FK

0

這當然是可能的爲了性能的原因,這樣拆分數據尤其如果你正在處理大量列中的大量數據:例如,你可能只是將「基本」用戶信息放在一個表中,而詳細的東西(例如,具有大的文本字段)放在另一個表中這些並不像基本的東西那樣經常訪問。也許你需要部分數據的全文功能,以便使用具有不同存儲引擎的表格。如果ebaghaki出於性能原因需要這樣做,我會說它確定 - 但請確定,您的應用程序確保密鑰的有效性(或使用觸發器保持最新?)。

另一種方法是構建一個查找表,它只保存對用戶和字符表的引用。那麼對於沒有選擇一個或多個用戶沒有選擇的字符的用戶,您將不會遇到空值問題。這可能是你最好的選擇,因爲你沒有因上面提到的任何原因而拆分表格。