我应该将语义上几乎相同的实体拆分到不同的表中吗?

css*_*418 2 database-design table

假设您有 2 个不同的实体:

  • 实体 1:PersonalNote - 您为自己创建的注释
  • 实体 2:SharedNote - 您与其他人分享的笔记

PersonalNote 也可以被视为仅与您自己共享的 SharedNote。因此,它们的数据库模式可以相同或几乎相同。

这种语义差异是否足以证明每个数据库表都需要一个单独的数据库表,或者最好将两者合并到同一个数据库表中,因为它们的模式可以相同(其中一个有一个 NULL 字段)?

两个表的一个缺点是有很多看起来相似的代码和几乎相同但独立的数据类。我认为一张桌子的一个缺点是性能。

我已经考虑这个问题有一段时间了,但我无法决定选择哪个。也许我也错过了一些重要的东西。这里最好的选择是什么?

J.D*_*.D. 10

对我来说,听起来你有一个实体/对象,一个Note. 您可以使用NoteTypeIsNoteShared字段来区分它是个人笔记还是共享笔记。

或者,您甚至可以无需额外的字段来区分两者,只需创建第二个表,名为 ,UserNotes该表仅存储NoteId来自Notes表的 和UserId来自Users table (您可能已经拥有)。如果记录在表中,则意味着该注释是共享的,否则,如果该记录不在该表中,则仅对通过表中的字段UserNotes创建该注释的用户可用。CreatedByUserIdNotes

以这种方式设计的好处是因为该UserNotes表允许通过一种方式来关联和之间的多对多关系NotesUsers您希望NotesUsers.

示例 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)
);
Run Code Online (Sandbox Code Playgroud)