为SQL中的许多实体表实现Notes表的最佳方法

时间:2010-08-27 13:17:05

标签: sql entity-framework

我有很多桌子:顾客,潜在客户,朋友...... 他们都有一些笔记。

问题1: 我是否应该与所有父表共享一个Notes表 OR
我应该有NotesCustomer,NotesProspects,NotesFriends表吗?

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

我正在使用EntityFramework,但这个问题也很普遍,我猜...

由于 乔恩

5 个答案:

答案 0 :(得分:6)

第一个选项是潜在客户,客户和朋友的独特Notes表,可能是一个更清洁的解决方案。

如果使用常规注释表,则需要有三个可空的FK列来确定FK所属的相关表,每行中只填充其中一个。

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

答案 1 :(得分:1)

第一个选项是最好的一个Notes表与所有其他选项共享。

您可以使用两个字段notes_obj_id和notes_obj_type来实现表格一般注释

答案 2 :(得分:0)

我直觉上更喜欢一种表格方法,但它也有其缺点。 Pro one-table:如果您需要更改其结构,则创建具有相同结构的多个表可能会很痛苦。此外,每当您查询注释而不是逻辑上更干净的“type”参数时,您都必须为表名添加变量。然而,菲尔的论点也很有趣。您可能还会发现,单表布局最终可能会使用仅使用SQL无法轻松查询的数据库。如果您将拥有大量数据,那么使用不同的表格也会给您带来速度差异。

嗯。一个非常干净但也有点复杂的解决方案是创建一个表NotableObject。然后给每个客户,潜在客户,无论字段“NotableObjectID”如何,并将注释链接到NotableObjects,而不是链接到客户或潜在客户。当然,如果你想要“给我所有关于顾客的笔记”之类的东西,这会使事情变得复杂,因为你只是明确地存储来自顾客的信息而不是反转,但是因为在大多数情况下,你会有更像“给我这个顾客的所有笔记“,你可能没事。

答案 3 :(得分:0)

您应该只有一个Notes表。关系从Notes流向其他实体(它是0:M),因此不需要在Notes表级别拥有FK列。 Notes表上的Prospect,Customer,Friend的FK列只会导致设计,每当新实体需要Notes时,您需要继续将FK列添加到Notes表中(这实际上不会加快速度) 。

例如,如果您想获得所有Prospect注释的列表,只需查询Prospect表并使用连接,如果您必须获得注释详细信息:

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

您的Notes表可能类似于:

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

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

答案 4 :(得分:0)

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

这将允许不止一个音符。

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