css*_*418 2 database-design table
假设您有 2 个不同的实体:
PersonalNote 也可以被视为仅与您自己共享的 SharedNote。因此,它们的数据库模式可以相同或几乎相同。
这种语义差异是否足以证明每个数据库表都需要一个单独的数据库表,或者最好将两者合并到同一个数据库表中,因为它们的模式可以相同(其中一个有一个 NULL 字段)?
两个表的一个缺点是有很多看起来相似的代码和几乎相同但独立的数据类。我认为一张桌子的一个缺点是性能。
我已经考虑这个问题有一段时间了,但我无法决定选择哪个。也许我也错过了一些重要的东西。这里最好的选择是什么?
J.D*_*.D. 10
对我来说,听起来你有一个实体/对象,一个Note
. 您可以使用NoteType
或IsNoteShared
字段来区分它是个人笔记还是共享笔记。
或者,您甚至可以无需额外的字段来区分两者,只需创建第二个表,名为 ,UserNotes
该表仅存储NoteId
来自Notes
表的 和UserId
来自Users
table (您可能已经拥有)。如果记录在表中,则意味着该注释是共享的,否则,如果该记录不在该表中,则仅对通过表中的字段UserNotes
创建该注释的用户可用。CreatedByUserId
Notes
以这种方式设计的好处是因为该UserNotes
表允许通过一种方式来关联和之间的多对多关系Notes
Users
您希望Notes
给Users
.
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)