首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多到多的关系?

多到多的关系?
EN

Stack Overflow用户
提问于 2014-03-19 12:31:27
回答 3查看 2K关注 0票数 1

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

我的应用程序在C# windows窗体中,所以在新的票证生成表单中,我有许多文本框和一个comboBox,用于分配由tblEngineer填充的工程师。在票证生成时,在此表单中输入的所有信息与来自tblTicketEngineerID一起存储在tblEngineer中。

这是很好的工作,但后来我的客户要求我增加选项,以便3名工程师可以指派一张单程票。

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

我该怎么做呢?如果只有一个工程师,那就很容易了。现在,我是否需要使用票证id和多个工程师id创建一个多到多的表,比如tblAssignedEng?作为外键引用?我没有太多的SQL经验,所以我在这里有点挣扎,任何帮助都会很感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-19 13:06:20

标准做法是这样的,举个例子.

你有一张"tblEngineer“桌子..。

代码语言:javascript
复制
 tblEngineer
 -----------
 (PK) EngineerId
 EngineerName

还有一张"tblTicket“桌子..。

代码语言:javascript
复制
 tblTicket
 ---------
 (PK) TicketId
 TicketDetails

现在添加一个名为"tblEngineerTickets“(或类似的)的链接表,它引用了工程师的Ids和它们的票证.

代码语言:javascript
复制
 tblEngineerTickets
 ------------------
 (PK) EngineerTicketId
 (FK) EngineerId
 (FK) TicketId

因此,您可以将所有的票证详细信息和工程师详细信息分开保存,并仅使用Ids链接它们.链接表看起来像这样..。

代码语言:javascript
复制
  EngineerId | TicketId
 ------------+----------
      1      |    1
      1      |    2
      1      |    3
      2      |    1
      2      |    2
      2      |    3

通过这种方式,您可以将多个工程师分配给一张票证,并/或多张票分配给一名工程师。

这是最好的实践,它给你最有机会的扩张。如果您只是将字段添加到您现有的工程师表中,上面写着"Ticket1“、"Ticket2”、"Ticket3“等.实际上,您将对代码设置一个限制,并且可能需要继续使用代码来添加列。

票数 4
EN

Stack Overflow用户

发布于 2014-03-19 12:39:47

我建议建立一对多的关系,而不是建立多到多的关系。您可以通过拥有一个在tblTickettblEngineer之间映射的表来实现这一点。例如:

代码语言:javascript
复制
tblEngineer
-----------
(PK) iEngineerID


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


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

通过这样做,工程师和Ticker可以在许多地图中,建立两个一对多的关系,并允许您所寻求的功能。

关于为什么要尽量避免多到多表设计的Check out this thread

票数 3
EN

Stack Overflow用户

发布于 2014-03-19 12:38:00

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

这意味着数据操作需要3个表,包括关系查询引擎的大量开销。

是否有方法通过在成员表中集成所有这些数据来简化这一点?

为每个州分配一个代码:

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 ))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22505938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档