首先,让我描述一下业务问题:
每次销售代表打电话时,他都必须记录通话中发生的情况。这称为处置。但是某些处置可能会有子处置-这意味着如果他们选择了一个子处置,那么他们将获得更多可供选择的物品清单。其中一些人也对此有孩子倾向。 (最多3个级别)。
然后,业务需求不仅是捕获最终选择的内容,还要捕获中间的结果。
如何在数据库中对此建模?
到目前为止,我们已经提出了一个Disposition_Map表,如下所示:
CREATE TABLE [dbo].[dispo_map](
[dispo_map_id] [int] IDENTITY(1,1) NOT NULL,
[parent_dispo_id] [int] NULL,
[child_dispo_id] [int] NOT NULL,
[dispo_map_type_id] [int] NOT NULL,
这确实有效,但是对我来说似乎很麻烦。
答案 0 :(得分:1)
您应该使用外键来完成此操作!
外键是表上的一个值,它直接链接到同一表或不同表中的唯一值。因此,外键将是您不同处置之间的参考。
例如,假设您的销售电话表格如下:
[int,PK销售电话ID],[int雇员ID],[varchar处置]
因此,每个销售电话都有一个ID,以及一个相关的员工ID,以指示是谁打电话。它也有一个“根”配置,即您正在谈论的第一层。但是孩子的性格呢?好吧,看起来可能像这样:
[int,PK处置ID],[int,FK销售电话ID],[varchar处置]
请注意,在我们的处置表中,销售呼叫ID如何具有FK约束?这意味着它直接与上表中的销售呼叫ID相关联。而且,如果您想要孩子的性格,则可能看起来像这样:
[int,PK处置ID],[int,FK父处置ID],[varchar处置]
每个类型的配置都会得到一个表,而每个 association 都会得到一个外键约束。这样,您就无法添加与呼叫或其他处置均不相关的处置,并且您始终可以通过遵循外键链来找出该处置属于谁。
如果您正在使用T-SQL,请检查这些MSDN文档中有关外键关系的语法:
祝你好运!
答案 1 :(得分:1)
详细说明正确的注释,这是使用外键的一种基本设置。因此,当您将记录插入dispo_map
时,它必须包含映射到parent_dispo_id
的{{1}}
dispo.dispo_id
答案 2 :(得分:1)
通过使用自引用FK,您可以达到您的大部分要求。在这种情况下,您的处置表需要一个FK到其自己的PK,该列大概名为parent_dispo_id。
此方法不满足的要求是最大深度,您需要在应用程序层强制实施。公平地讲,您建议的方法也不会强制执行最大嵌套的3个级别。为了在数据库层实施此操作,我想您将需要使用映射表,但您需要在同一表中具有父级Dispo,子级Dispo和可为空的孙级Dispo,并且对3列。