2010-08-27 20 views
4

我有很多表:客户,潜在客户,朋友..
他们都有一些注释。实现许多实体的Notes表的最佳方式SQL中的表

问题1: 我是否应该有一个与所有父表共享的Notes表。

我应该有一个NotesCustomer,NotesProspects,NotesFriends表吗?

问题2:
如果最好的解决方案是第一个,那么这个一般的Notes表应该有一个FK到父表,但也是父表的类型?

我使用的EntityFramework,但这个问题也一般我猜...

感谢 乔恩

回答

1

第一个选项是最好的注释表与所有的人分享。

可以使用两个字段notes_obj_id和notes_obj_type实现表一般注意事项

+0

2个答案(菲尔和ritesh)正好说相反! – John 2010-08-27 13:28:42

+0

等一天,看看upvotes说什么。 – 2010-08-27 13:54:40

+0

(8月30日)我休息我的情况。 – 2010-08-30 14:04:23

6

第一个选项,为潜在客户,客户和朋友们的独特表的注意事项,可能是一个清晰的解决方案。

如果您使用一般笔记表,您需要有三个可为空的FK列来确定FK属于哪个相关表,并且每行只填充其中一个。

一般而言,良好的关系模型的目标不是(或不一定)将类似数据存储在一起,而只存储一次特定数据。所以在设计这个问题时问自己一个很好的问题是“我将所有笔记存储在同一个表中,从而获得了什么?”

+1

+1会提出相反的建议,但“良好的关系模型的目标不是(或不一定)将数据存储在一起,而是只存储一次特定数据”让我想到了 – Nicolas78 2010-08-27 13:31:37

+4

+1。我曾经做过单笔记表类型的事情,而且我再次做得很慢。我认为它为我节省的最大的东西是在我的SQL脚本中创建更少的表,这对于事情的方案来说并不是什么大不了的事情,事实证明,这是一个痛苦的工作。 – joelt 2010-08-27 13:33:40

+0

是的,我同意。这只是我要求社区的确认,我得到了两个对立的答案...... – John 2010-08-27 13:33:59

0

我会直觉地喜欢一个表的方法,但它也有它的缺点。 Pro one-table:如果您需要更改其结构,则创建具有相同结构的多个表格可能会很痛苦。此外,只要您查询注释而不是逻辑上更简洁的“type”参数,就必须为表名添加一个变量。但是,菲尔的观点也很有趣。您也可能发现单表布局可能最终会导致只能使用SQL无法轻松查询的数据库。如果您要获取大量数据,使用不同的表格也会带来速度差异。

嗯。一个非常干净但也有点复杂的解决方案是创建一个表NotableObject。然后给每个客户,潜在客户,任何字段“NotableObjectID”,并将注释链接到NotableObjects,而不是客户或潜在客户。当然,如果你想要“给我所有的客户注意事项”这样的话,这会使事情变得复杂化,因为你明确地只存储客户提供的信息而不是反向的信息,但是因为大多数时候你会遇到更像“给我这个客户的所有笔记“,你可能会没事的。

0

您应该只有一个Notes表。关系从Notes流向其他实体(它是0:M),因此不需要在Notes表级别具有FK列。在Notes表上,向展望,客户,朋友提供的FK列只会导致一个设计,在每次新实体需要Notes时都需要不断添加FK列到Notes表中(并且这并不能真正加快速度) 。

E.g.如果你想获得的所有展望笔记列表,只需要查询的展望台,并使用一个连接,如果你必须得到说明详细介绍:

select n.NoteId, n.NotesDetail from Prospect p inner join Notes n 
    on p.NoteId = n.NoteId 

你的注意事项表可能类似于此:

create table Notes 
(
    NoteId int identity(1,1) 
    ,NotesDetail varchar(max) 
    // ... any other fields related to the Notes entity.... 
) 

在其他表上,您只需要一个字段FK链接到Notes表上的NoteId。

+1

如果每个相关实体需要多个注释,则不需要。如果每个实体需要一个音符,则没有理由首先有单独的Notes音符表。 – 2010-08-27 15:45:28

+0

@Phil,同意,如果每个实体有多个注释,则需要一个连接表。我不同意通过非规范化连接表来实际包含注释。 – code4life 2010-08-27 16:31:21

+1

我的意思是:如果每个实体只有0-1个注释,则只需将注释存储在主实体表中,不需要额外的表。 IOW,客户表将会有一个名为“Note”的列。我不清楚你的反规范化连接表的含义。 – 2010-08-27 17:49:21

0

我意识到这是旧的,但..

这将允许多个笔记。

select n.NoteId, n.NotesDetail from Prospect p inner join Notes n 
on n.EntityId = p.id AND n.EntityType ='prospect' 
相关问题