很多关系?

时间:2014-03-19 12:31:27

标签: sql many-to-many

伙计们我正在努力为我的公司制作一个简单的票务生成系统。现在,我的MSSQL数据库中有一个名为tblTicket的表和另一个名为tblEngineer的表。

我的应用程序是在C#窗体表格中,所以在新的票证生成表单中,我有许多文本框和一个用于分配工程师的组合框,由tblEngineer填充。生成故障单后,此表单中输入的所有信息都会与tblTicket中的EngineerID一起存储在tblEngineer中。

它工作得很好,但后来我的客户要求我添加选项,以便可以在一张票上分配3名工程师。

将来,我将不得不开发一个"工程师模块"在哪个工程师只能看到分配给他的门票。它将包括用于身份验证的登录系统。因此,如果生成一张新票并分配给3名工程师,那么只有3名工程师能够看到该票,而不能看到其他票。

我应该如何处理这种方法?如果只有一名工程师,那真的很容易。现在,我是否需要创建一个多对多的表,如tblAssignedEng,其中包含票证ID和多个工程师ID?引用为外键?我对SQL有很多经验,所以我在这里有点挣扎,任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:3)

我建议建立一对多的关系,而不是建立多对多的关系。您可以通过在tblTickettblEngineer之间制作表格来完成此操作。例如:

tblEngineer
-----------
(PK) iEngineerID


tblTicket
---------
(PK) iTicketID


tblTicketEngineerMap
--------------------
(PK) iMapID
(FK) iEngineerID
(FK) iTicketID

通过这种方式,工程师和Ticker可以在许多地图中,形成两个1对多关系,并允许您寻求的功能。

Check out this thread至于为什么要尝试避免多对多的表设计。

答案 1 :(得分:3)

标准做法就是这样,作为一个例子......

你有一个“tblEngineer”表......

 tblEngineer
 -----------
 (PK) EngineerId
 EngineerName

和“tblTicket”表......

 tblTicket
 ---------
 (PK) TicketId
 TicketDetails

您现在添加一个名为“tblEngineerTickets”(或类似)的链接表,该表引用了工程师及其票证的ID ...

 tblEngineerTickets
 ------------------
 (PK) EngineerTicketId
 (FK) EngineerId
 (FK) TicketId

这样,您可以单独保留所有故障单详细信息和工程师详细信息,并仅使用Ids链接它们...链接表看起来像这样......

  EngineerId | TicketId
 ------------+----------
      1      |    1
      1      |    2
      1      |    3
      2      |    1
      2      |    2
      2      |    3

这样,您可以将多个工程师分配给一个工单,和/或将多个工单分配给工程师。

这是最佳做法,它为您提供了最大的扩展机会。如果您只是在现有的工程师表中添加字段“Ticket1”,“Ticket2”,“Ticket3”等等......您实际上会对代码设置限制,并且您可能必须继续使用添加列的代码。

答案 2 :(得分:0)

使用列存储不同的逻辑值: 点击此链接http://sqlpro.developpez.com/cours/stockageopt/

enter image description here

enter image description here

这意味着数据操作需要3个表,包括关系查询引擎的显着成本。

有没有办法通过在Member表中集成所有这些数据来简化这一过程?

为每个州分配代码:

Methode 1 :(使用2个表)

tblTicket(id_Ticket,工程师)

工程师(id_eng,其他专栏)

在tblTicket工程师中,您可以设置多个值,如id_1 - id_2 - id_3(1-2-3)3位工程师

Methode 2 :(使用3个表)

tblticket(id_ticket,其他列)(主键:id_Ticket)

工程师(id_Eng,其他列)(主键:id_Eng)

TicketEng(id_Ticket,id_Eng)(主键:(id_Ticket,id_Eng))