2016-05-27 46 views
2

我是新的數據庫,我打算與你分享2數據庫表設計在這裏,我只想知道哪一個是最好的設計,爲什麼?這是最好的數據庫設計爲mysql

第一個我創建了一個用戶表,主題表和user_subject表。

在用戶表中我保存用戶信息,並在主題我保存主題。 IN user_subject中我保存了用戶ID和主題ID。

CREATE TABLE IF NOT EXISTS `subjects` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `users` 
-- 

CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

-- -------------------------------------------------------- 

-- 
-- Table structure for table `user_subjects` 
-- 

CREATE TABLE IF NOT EXISTS `user_subjects` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(11) NOT NULL, 
    `subject_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

2一個>

CREATE TABLE IF NOT EXISTS `subjects` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 



CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `subject_name` varchar(2000) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

我保存的用戶,它的在user表科目昏迷(,),鯡魚,而不是創建另一個表保存用戶和主題標識。

我的第二個問題是最好的,因爲我們不需要在第三個表中保存數據。請告訴我哪一個是最好的和持久的未來。

+4

第一個好得多。將數據保存爲逗號分隔值,限制了使用索引進行查詢的能力。 **順便說一句**你不需要在第三張桌子上有「ID」。只需用'(用戶,主題)'創建一個複合鍵' –

+0

@JuanCarlosOropeza是正確的。第一個好多了。 – Harman

回答

2

第一個版本好多了,好多了。這裏有一些你不想使用逗號分隔的字符串的原因:

  • SQL沒有特別好的字符串函數 - 基本的,但沒有更多。
  • 當您將值存儲在分隔字符串中時,數據庫無法驗證數據。使用單獨的表格可以使用外鍵約束。
  • 逗號分隔列上的查詢無法使用標準索引(儘管可能使用全文索引)。
  • 使用逗號分隔的字符串,數據庫無法驗證主題是否唯一。

第一種方法使用聯結表,它是在關係數據庫中實現此邏輯的更好方法。

0

這是確定使用第二種方式IF:

1)主題只有一個的重要性(名稱)

2)值唯一標識對象的值(即沒有二級學科具有相同的名稱),或者不需要區分同名的兩個主題

一般而言,第一種方式更好,因爲如果您突然決定爲主題賦予新的值(例如年齡),則不必重做您的整個桌子結構。

0

無論如何,第二個解決方案並不是很好,因爲您不能使用連接或索引。

哪個解決方案最好,取決於用戶和主題之間的關係類型。 如果每個主題只屬於一個用戶,並且每個用戶可以有任意數量的主題,這意味着您有一對多的關係,但應該將user_id添加到表主題。

如果任何主題可以屬於多個用戶,並且每個用戶可以有多個主題,則應該使用第一個解決方案和第三個映射表(這將是多對多關係)。

在這兩種情況下,你可以表達使用一個簡單的SQL很容易且乾淨以下查詢聯接:

  • 該科目屬於給定用戶
  • 哪些用戶擁有含有一定的表達的名稱科目
  • 這是給定主題的用戶(是第二種情況下的用戶)