我正在使用客户关系管理应用程序。我有两个表:tbl_Inquiry_master
用于存储最终用户提出的查询问题详细信息,tbl_Inquiry_History
用于存储查询答案详细信息。
然而,这显示了将一个问题商店存储到表tbl_Inquiry_master
以及工作人员对表tbl_Inquiry_History
中存储的查询给出的答案的知识。
有关详细信息,我代表表tbl_Inquiry_master
架构:
Column Name Data Type
_________________________________________
Id varchar(50)
Inquiry_subject varchar(100)
Status_id numeric(18, 0)
Created_date datetime
Priority_id numeric(18, 0)
User_id varchar(50)
Email_Address varchar(50)
Service_id numeric(18, 0)
Inquiry_Content varchar(1024)
TimeStamp datetime
表tbl_Inquiry_History
架构:
Column Name Data Type
_________________________________________
Id numeric(18, 0)
Inquiry_id varchar(50)
Inquiry_subject varchar(50)
Service_id numeric(18, 0)
Priority_id numeric(18, 0)
User_id varchar(50)
Status_id numeric(18, 0)
Inquiry_desc varchar(1024)
IsDisplay bit
IsRead bit
IsReplied bit
TimeStamp datetime
Activity_start_time datetime
Activity_expire_time datetime
表tbl_User_master
架构:
Column Name Data Type PK/FK Reg Table Ref Key
____________________________________________________________________________________
Id varchar(50) PK - -
User_id varchar(50) FK tbl_Login_master Id
Full_Name varchar(50)
.
.
Email_Address varchar(50)
表tbl_Question
架构:
Column Name DatType PK/FK Ref Table Ref Key
____________________________________________________________________
Id int PK - -
UserId varchar(50) FK tbl_User_master Id
Body varchar(1024)
Inquiry_Id varchar(50) FK tbl_Inquiry_master Id
表tbl_Answer
架构:
Column Name DatType PK/FK Ref Table Ref Key
____________________________________________________________________
Id int PK - -
QuestionId int FK tbl_Question Id
Body varchar(1024)
Inquiry_Id varchar(50) FK tbl_Inquiry_master Id
但是我不知道如何存储多个查询的问题(由最终用户提出)和多个查询的答案(由工作人员用户提供)。
我包含此存储过程,用于插入从最终用户生成的新查询以及信息如何存储到表层次结构。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[InsertInquiry]
(
@Inquiry_subject VARCHAR(50),
@Service_name VARCHAR(50),
@Priority_type VARCHAR(25),
@User_id VARCHAR(50),
@Inquiry_desc VARCHAR(1024),
@email VARCHAR(50),
@NewId VARCHAR(50) OUT
)
AS
SET NOCOUNT ON;
declare @var1 int
declare @var2 int
declare @var3 int
declare @uniqueRef char(14)
set @uniqueRef = dbo.UniqueRefNum(rand(), rand(), rand(), rand())
BEGIN TRAN;
BEGIN TRY
SET @var1= (SELECT [Id] FROM [OmStocks].[dbo].[tbl_Status_master] WHERE (Status_name='Open'))
SET @var2= (SELECT [Id] FROM [OmStocks].[dbo].[tbl_Service_master] WHERE (Service_name=@Service_name))
SET @var3= (SELECT [Id] FROM [OmStocks].[dbo].[tbl_Priority_master] WHERE (Priority_name=@Priority_type))
INSERT INTO [OmStocks].[dbo].[tbl_Inquiry_master]
([Id]
,[Inquiry_subject]
,[Status_id]
,[Created_date]
,[Priority_id]
,[User_id]
,[Email_Address]
,[Service_id]
,[Inquiry_desc])
VALUES
(@uniqueRef,@Inquiry_subject,@var1,CONVERT(DATETIME,GETDATE(), 101),@var3,@User_id,@email,@var2,@Inquiry_desc)
INSERT INTO [OmStocks].[dbo].[tbl_Question]
([UserId],[Body],[Inquiry_Id])
VALUES
(@User_id,@Inquiry_desc,@uniqueRef)
INSERT INTO [OmStocks].[dbo].[tbl_Inquiry_History]
([Inquiry_id]
,[Inquiry_subject]
,[Service_id]
,[Priority_id]
,[User_id]
,[Status_id]
,[Inquiry_desc]
,[IsDisplay]
,[IsRead]
,[IsReplied]
,[Activity_start_time])
VALUES
(@uniqueRef,@Inquiry_subject,@var2,@var3,@User_id,@var1,@Inquiry_desc,0,0,0,CONVERT(DATETIME,GETDATE(), 101))
SET @NewId= @uniqueRef
COMMIT TRAN;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
-- Raise the error with the appropriate message and error severity
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int;
SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY();
RAISERROR(@ErrMsg, @ErrSeverity, 1);
END CATCH;
有人可以向我建议我需要对我的架构进行哪些更改来存储此场景的数据吗?
答案 0 :(得分:1)
简单来说,您需要一个User表,一个Question表和一个Answer表,它们按顺序组成一个层次结构。每个答案行都有一个外键,返回与其相关的问题。每个问题行都有一个外键返回给用户提出问题(我想用户会有一个外键回到客户/合同等)。然后,您将使用仅与该实体相关的属性来装饰每个实体。您的历史记录表目前似乎更像是一个审计跟踪,而不是答案表(主表中的大量非规范化列)。
类似的东西: -
User table
---------------------------
Id int
Email varchar(50)
Question table
---------------------------
Id int
UserId int
Body varchar(1024)
Answer table
---------------------------
Id int
QuestionId int
Body varchar(1024)
然后在适当的级别添加架构中的列。例如,Status_id是否描述了问题的状态或答案。我认为Priority_id与问题有关,而与答案无关,所以它只应存在于问题表中。
在不知道每列的实际使用情况的情况下,很难提供与您的架构直接相关的更具体的答案。
答案 1 :(得分:1)
我还不清楚master和history上的文本字段是什么(以及历史表是否应该是此层次结构的一部分)但是 - 如果您使用以下作为示例: -
create table tbl_Inquiry_master (
id int,
body varchar(1024)
);
create table tbl_Inquiry_history (
id int,
inquiry_id int,
body varchar(1024)
);
create table tbl_question (
id int,
inquiry_id int,
body varchar(1024)
);
create table tbl_answer (
id int,
question_id int,
body varchar(1024)
);
insert into tbl_Inquiry_master values (1, 'inquiry one');
insert into tbl_Inquiry_master values (2, 'inquiry two');
insert into tbl_Inquiry_master values (3, 'inquiry three');
insert into tbl_Inquiry_master values (4, 'inquiry four');
insert into tbl_Inquiry_history values (1, 1,'history 1 (relates to inquiry 1)');
insert into tbl_Inquiry_history values (2, 3,'history 2 (relates to inquiry 3)');
insert into tbl_question values (1,1,'inquiry one question one')
insert into tbl_question values (2,1,'inquiry one question two')
insert into tbl_question values (3,2,'inquiry two question one')
insert into tbl_question values (4,4,'inquiry four question one')
insert into tbl_answer values (1,1,'answer 1 to question 1')
insert into tbl_answer values (2,1,'answer 2 to question 1')
insert into tbl_answer values (3,2,'answer 1 to question 2')
insert into tbl_answer values (4,4,'answer 1 to question 4')
insert into tbl_answer values (5,4,'answer 2 to question 4')
insert into tbl_answer values (6,4,'answer 3 to question 4')
select
i.id as inquiry_id,
i.body as master_body,
h.body as history_body,
q.body as question_body,
a.body as answer_body
from tbl_Inquiry_master i
left join tbl_Inquiry_history h on h.inquiry_id=i.id
left join tbl_question q on q.inquiry_id=i.id
left join tbl_answer a on a.question_id=q.id
你最终得到: -
inquiry_id master_body history_body question_body answer_body
----------- -------------- --------------------------------- -------------------------- ----------------------
1 inquiry one history 1 (relates to inquiry 1) inquiry one question one answer 1 to question 1
1 inquiry one history 1 (relates to inquiry 1) inquiry one question one answer 2 to question 1
1 inquiry one history 1 (relates to inquiry 1) inquiry one question two answer 1 to question 2
2 inquiry two NULL inquiry two question one NULL
3 inquiry three history 2 (relates to inquiry 3) NULL NULL
4 inquiry four NULL inquiry four question one answer 1 to question 4
4 inquiry four NULL inquiry four question one answer 2 to question 4
4 inquiry four NULL inquiry four question one answer 3 to question 4
然后,您可以使用此加载转发器,并通过抑制重复的文本,生成可能有意义的内容。输出可能更容易在层次结构(XML等)中处理,而不是矩形结果集 - 但这是一个完全不同的问题。
答案 2 :(得分:0)
确定。让我们重新开始吧。
从数据库中删除表tbl_Question并删除您存在的任何内存。
从数据库中删除表tbl_Answer并删除您存在的所有内存。
当用户提出问题时,请向tbl_Inquiry_master添加一行,以使用新ID标记问题。如果用户需要提出多个问题,请向tbl_Inquiry_master添加一个新行以记录每个问题(每个问题都有自己的唯一ID)。
当一名工作人员回复某个问题时,会在记录答案的tbl_Inquiry_History中添加一行。此行上的Inquiry_id应指回tbl_Inquiry_master中与其相关的问题的ID。如果其他员工想要在同一问题中添加第二个或后续回复,请向tbl_Inquiry_History添加另一行,该行记录他们的回答,此行上的Inquiry_id指向tbl_Inquiry_master中问题的同一ID。