2012-10-10 85 views
4

我剛剛瞭解關係數據庫,並被告知他們不允許重複條目。起初我並不相信這一點,因爲我編寫了SQL查詢,它返回重複的結果。這就是說系統不存儲在一個關係中相同的集合嗎?我的意思是,如果您與書籍和作者有關係,並且僅選擇作者,那麼如果同一作者編寫了不同的書(例如select author from Books),則可能會出現重複。此外,如果你使用加入,那麼你可以得到重複的結果,對吧?任何其他情況?SQL何時可以包含重複項?

基本上,當人們說rmdbs沒有重複的時候,他們只是指信息存儲的方式(在一個表中)是正確的?

+1

「並被告知他們不允許重複輸入」 - 您可能錯誤理解或錯過了某些上下文。 – Mat

+0

@Mat我相信我誤解了,因此我要求澄清。 – Celeritas

回答

2

基本上當人們說rmdbs沒有重複的時候,他們的意思是 信息的存儲方式(在一個表中)是正確的?

你基本上是對的。

規範化的一部分是確保沒有數據需要存儲兩次,因爲這增加了其中一個數據不是最新的風險。那就是決不是就像說RDBMS不能存儲重複數據一樣。它肯定可以和有很多的場景,它甚至被認爲是一個可行的解決方案(數據倉庫爲一個)

完全normalized database(又名沒有重複的數據)之間的權衡denormalized database(又名全重複數據)是CRUD語句的速度和數據庫的大小。

1

你可以很好地把重複表放在一個表中,除非表中有明確禁止的限制。

通常,一個表有一個主鍵,而一個主鍵是一個約束,該約束不允許作爲該鍵的一部分的字段存在重複項,這樣可以防止該表具有重複的記錄。

+0

但是,這不是那種主要的關鍵類型,它只是用於這個目的的一個屬性?我的意思是如果你查詢'插入x到y'兩次,其中y只有一個屬性會發生什麼? – Celeritas

+0

如果該表的列上有一個唯一的約束*(或主鍵)*,那麼RDBMS將不允許第二次插入,但是由設計人員來告訴RDBMS哪些表中哪些列應該是唯一的。沒有RDBMS *(我知道)*默認強制執行此唯一性。 –

4

關係數據庫僅由關係變量(關係「表」)組成,它由定義總是由唯一元組(「行」)組成。關係數據庫管理系統使用基於Codd的關係代數的查詢語言,它類似地不能在結果中產生重複,因爲關係代數中的每個結果也是一個關係,因此由唯一的元組組成。

由於您認爲SQL是適當的關係語言並且SQL DBMS是關係型的,因此您會產生困惑。它不是,他們不是。當你開始比較SQL與關係世界中的近似等價物時,事情會變得棘手。您的SQL查詢:

SELECT author FROM Books; 

可能返回重複的行,但顯然類似的關係查詢:

π author (Books) 

不會。關係查詢更像以下SQL:

SELECT DISTINCT author FROM Books; 

你必須在SQL非常小心,以避免重複獲得,你不想要或希望他們。即使有經驗的SQL用戶也會遇到問題。

3

關係是元組的集合。因爲它們是集合,所以關係不能包含兩次相同的元組。

如果某件事(例如,SQL中的「表」)確實包含「相同的元組兩次」,那麼這不是關係,並且該語言不是關係語言。充其量,只要語言使用者對自己施加必要的自律,語言就可以以關係方式使用。

簡介:關係數據庫管理系統的確實不能讓重複,典型的SQL引擎不是關係數據庫管理系統的正是這種原因(A.O.)

0

RDBMS可以有重複,特別是如果他們不設置得非常好。設置RDBMS需要您瞭解標準化是什麼。如果您有重複項,則表示您的表可能不是第一個標準化表格。第一種標準化格式中表格的定義是消除或消除重複值,因此如果您有重複/重複值,則需要先將表格標準化爲第一標準化格式標準,方法是消除重複值,然後將其轉換爲第二格式規範化表格等等。

相關問題