与上传的数据建立多对多的关系

时间:2014-10-30 16:03:02

标签: mysql sql database database-design relational-database

我浏览了互联网,但我遇到的大多数例子都只解释了如何与用户输入形成关系。我正在寻找的是下面的内容:

表1

      -----ID--------NAME-----------
           1     Bill Smithers 
           2     Steve oneguy
           3     Mike Michaels 
      -------------------------------

表2

      ----ID------Number--------charges------
          1    111-111-1111      $1.01
          2    111-111-1111      $2.00
          3    222-222-2222      $3.00
          4    333-333-3333      $ .50
          5    111-111-1111      $2.50
          6    222-222-2222      $1.75
      ----------------------------------------

加入表后的结果如下所示:

     -----Name-------------Number-------------Charges-----
        Bill Smithers     111-111-1111        $1.01
        Bill Smithers     111-111-1111        $2.00
        Steve Oneguy      222-222-2222        $3.00
        Mike Michaels     333-333-3333        $ .50
        Bill Smithers     111-111-1111        $2.50
        Steve Oneguy      222-222-2222        $1.75
    -------------------------------------------------------

现在我知道需要有第三个表来保存关系,但是如果没有手动输入关系,我不知道如何让两个表相应地匹配。我认为第三个表最终需要看起来像这样:

        -----Name_ID-----------DATA_ID---------
                1                1
                1                2
                2                3
                3                4
                1                5
                2                6
        ---------------------------------------

源数据已经如下所示:

     -----Name-------------Number-------------Charges-----
        Bill Smithers     111-111-1111        $1.01
        Bill Smithers     111-111-1111        $2.00
        Steve Oneguy      222-222-2222        $3.00
        Mike Michaels     333-333-3333        $ .50
        Bill Smithers     111-111-1111        $2.50
        Steve Oneguy      222-222-2222        $1.75
    -------------------------------------------------------

但我想添加一些优化,因为该表最终会变得更大。

2 个答案:

答案 0 :(得分:0)

你的应用程序应该将数据放在一个glob中,对吗?每次有人添加金额时,他们会使用自己的电话号码吗?通过这种方式,您可以让您的应用程序为人员提交数据,然后通过电话/付款,从两者中获取ID,然后可以将其发送到第三个表格中。或者,您可以将所有部分提交到SP并让SP使用输出ID,因为您的应用程序并不关心。

这不是我如何安排它(因为电话号码可能会改变给定的人,使他们成为糟糕的标识符),但如果您正在寻找解决方案,请将每个实例传递给SP ,让SP对名称进行重复检查,插入捐赠,最后(使用两个ID)设置关系。

答案 1 :(得分:0)

你似乎在说你得到一个表源,你可以从中派生/提取/提炼Table1,Table2和Table3,这样当你将它们组合/重新组合成Result时它等于Source。

源/结果可能有重复的行,因为相同的名称,数字和数字成本可能会出现多次。要以关系方式查询,应将表设计为不重复。否则,查询结果并不意味着当没有重复时它们意味着直截了当的事情。谈论这样的行列表而不是行集也要复杂得多。标准SQL JOIN甚至没有被定义为在有重复输入时给出任何特定结果。

每个源/结果行对应一个呼叫。您可能实际上打算拥有更多的调用属性列,以便没有重复项。否则,您可以Using AUTO_INCREMENT获取唯一的来电ID。我将引用一个表值Call,它看起来像Source / Result,带有一个添加的唯一调用ID列。你真的应该使用Call而不是Source / Result。

  • 呼叫是"呼叫ID [ID]的人是名为[姓名]的人,号码[号码]是收费[收费]"
  • 表1是" [ID]标识名称[名称]"的行。
  • 表2是"呼叫[ID]为编号[编号]的行[充电]"。
  • 表3是"由ID [Name_ID]名称命名的人调用[DATA_ID]"。

当我们将Source中的Numbers和Costs插入Table2时,auto_increment将生成一个新的ID值。我们可以将该值视为Call中相应行的ID值。

当我们从Source中将相应的Names插入到Table1中时,不会在其中插入每个(新)名称的auto_increment生成新的ID。

然后我们可以通过Obtaining Auto-Increment Values将相应的ID和DATA_ID对插入到表3中。

现在让我们重新构建呼叫和来源/结果。回想一下,Call是行

  • " ID为[ID]的人是名为[姓名]的人,号码为[号码],收费为[收费]"

所以Call是行

  • "存在一个Name_ID,其中为     [Name_ID]标识名称[名称]
    并且由具有id [Name_ID]的名称命名的人调用[DATA_ID]
    AND [[DATA_ID]号码是号码[号码],收费[收费]"

所以Call是(通过将Table1,Table2和Table3替换为上述子弹的谓词/语句)

SELECT DATA_ID,Name,Number,Charge
FROM Table1 n
JOIN Table3 t ON n.ID=Name_ID
JOIN Table2 d ON DATA_ID=d.ID

我们通过电话

获得结果
-- keep duplicates
SELECT Name,Number,Cost
FROM Call

结果是

-- keep duplicates
SELECT Name,Number,Charge
FROM Table1 n
JOIN Table3 t ON n.ID=Name_ID
JOIN Table2 d ON DATA_ID=d.ID