Database-Design

我應該將語義上幾乎相同的實體拆分到不同的表中嗎?

  • December 2, 2021

假設您有 2 個不同的實體:

  • 實體 1:PersonalNote - 您為自己創建的筆記
  • 實體 2:SharedNote - 您與其他人共享的筆記

PersonalNote 也可以被視為只與您自己共享的 SharedNote。因此它們的數據庫模式可以相同或幾乎相同。

這是否足以證明每個單獨的數據庫表的語義差異是合理的,還是將兩者組合到同一個數據庫表中更好,因為它們的模式可以相同(其中一個具有一個 NULL 欄位)?

2 個表的一個缺點是有很多看起來相似的程式碼和幾乎相同但獨立的數據類。我想一張桌子的一個缺點是性能。

我一直在考慮這個問題,但我無法決定選擇哪個選項。也許我也錯過了一些重要的東西。這裡最好的選擇是什麼?

對我來說,聽起來你有一個實體/對象,一個Note. 您可以使用NoteTypeorIsNoteShared欄位來區分它是個人筆記還是共享筆記。

或者,您甚至可以不用額外的欄位來區分兩者,而是創建一個名為的第二個表,該表UserNotes僅儲存表中的和表中的(您可能已經擁有)。如果記錄在表中,則表示該註釋是共享的,否則如果它不在該表中,則它僅對通過表中的欄位創建該註釋的使用者可用。NoteId``Notes``UserId``Users``UserNotes``CreatedByUserId``Notes

以這種方式設計它的好處是因為該UserNotes表允許一種方法來關聯之間的多對多關係,Notes並且Users如果您希望允許Notes共享到多個Users.

範例 DDL

CREATE TABLE Users 
(
 UserId INT PRIMARY KEY, -- auto increment/identity
 UserName VARCHAR(50) NOT NULL
);

CREATE TABLE Notes 
(
 NoteId INT PRIMARY KEY, -- auto increment/identity
 CreatedByUserId INT NOT NULL REFERENCES Users(UserId),
 NoteText CLOB
);

Create table UserNotes 
(
 -- both are defined as NOT NULL via PK
 UserId INT REFERENCES Users(UserId), -- who else can see this
 NoteId INT REFERENCES Notes(NoteId), -- what Note they can view
 CONSTRAINT UserNotes_pk PRIMARY KEY (UserId, NoteId)
);

您可以分享您的 PersonalNote 以使其成為 SharedNote 嗎?您能否取消共享 SharedNote(但不刪除它,讓您自己使用它,從而使其成為 PersonalNote)。至少第一個是我希望能夠做到的,除非有充分的理由不這樣做。在這種情況下會發生什麼?您是否將數據從一張表移動到另一張表?這可能是一個潛在的昂貴操作,並且引入了一些錯誤的可能性,而翻轉單個位(共享或不共享)更便宜和更容易。您不想引入空值很好,但您不必這樣做,只需列出與該筆記共享的人員列表(我假設該筆記始終與其所有者共享)。

引用自:https://dba.stackexchange.com/questions/303371