【问题标题】:best method - vb.net and mysql最好的方法 - vb.net 和 mysql
【发布时间】:2011-07-14 21:18:46
【问题描述】:

我可以尽可能简短地解释情况的最佳方式:

我正在为一家珠宝公司制作维修系统。简单来说,我有一张客户表和一张维修表。客户表保存客户信息,维修表保存客户维修信息。 repair 和 customer 表通过 customer.ID 列(repair 表中的 customer_id)绑定在一起。

在系统中有查看客户现有维修的选项 - 显示与特定 customer_id 匹配的所有维修。

我为其制作此系统的客户想要一种将维修联系在一起的方法。例如,如果客户 john 在系统中有 4 次维修。两修是新的,两修已经完成。如果他们不希望在两个新维修完成之前联系客户,他们会查看所有现有维修,检查这两个,然后单击一个显示“联系维修”的按钮。

我无法考虑将这些维修联系起来的最佳方式 - 因此,在完成两次维修之前,客户不会出现在呼叫列表中。我提出的每个选项似乎都有缺点或效率不高。

我是否应该在修复表中创建一个名为tie_repairs 的列,并包含所有已绑定修复的 ID,并用 ; 分隔(或任何角色)?

提前致谢。

【问题讨论】:

    标签: mysql database vb.net


    【解决方案1】:

    永远不要将多个值放在一个带有分隔符的字段中。这会引起各种头痛。你将如何在这样的领域进行搜索?你将如何加入?数据库引擎将如何索引它?你必须做一大堆字符串处理。这是个坏消息。

    我看到了两种可能的解决方案,具体取决于真正的需求。

    Secnario 1:如果真正的要求是“客户可能会说他们不想在所有待处理的维修完成之前被呼叫”,那么您只需要客户表中的一个布尔字段,“如果任何维修不完整,请勿致电”。然后呼叫查询变成这样:

    select customername, whatever
    from customer
    join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
    where customer.allOrNothing=false
    or not exists
    (select 1 from repair ri where ri.customerid=customer.customerid and ri.completed=false)
    

    场景 2:您确实需要以任意组合方式将维修联系在一起。即,客户可能会说,在两者都完成之前,他们不想被要求维修 1 或 3,并且在两者都完成之前,他们不想被要求维修 2 或 5,但他们甚至可以被要求维修 4如果其他都没有完成,或者对于 1 和 3,或者对于 2 和 5。对于店员来说,输入和维护数据似乎非常复杂,但还好。

    您需要一个新表,我们称之为 RepairTies。此表有两列:RepairTieId 和 RepairId。每当您创建这样的联系时,您都会在 RepairTies 中为“联系集”中的每个修复创建一个记录。您创建一个 RepairTieId 来标识该集合。 RepairTieId 的值本身没有任何意义:它只是将修复记录绑定在一起的东西——如果你愿意的话,它是一个“锚点”。您需要这个,以便您可以将所有维修记录附加到不依赖于单个维修记录的内容。 (请注意,您不想将修复 #2 与修复 #1 绑定。如果有三个绑定修复,那么您将 #2 和 #3 绑定到 #1。然后用户说,哦,等等,#1 应该不在那个列表中,删除它。现在 #2 和 #3 绑定到......什么?你不想因为 #1 消失而失去 #2 和 #3 连接的事实。)

    那么查询就变成了:

    select customername, whatever
    from customer
    join repair rc on rc.customerid=customer.customerid and rc.completed=true and rc.pickedup=false
    where not exists
    (select 1 from repairtie t1
    join repairtie t2 on t1.repairtieid=t2.repairtieid and t2.completed=false
    where t1.repairid=rc.repairid)
    

    通常的免责声明:我没有测试过任何这些,这一切都在我的脑海中,所以细节可能存在错误,但原理应该有效。

    【讨论】:

    • 谢谢,我选择了你的方案二。我知道将多个值放在一列中是不行的。一位同事这样做,我一直不喜欢这个想法,在处理这些表格/列时让我很头疼。谢谢!
    【解决方案2】:

    我们已经在我们的应用程序中解决了同样的问题。

    我们还添加了另一列,但包含由字符分隔的IDs 对于数据库来说是一个坏主意。我们宁愿这样做:

    我们有一个表repairs,其中包含示例重要列:

    • REPAIR_ID
    • CUSTOMER_ID
    • REPAIR_STATUS(已完成,忙,或百分比,或日期...)

    我们添加了第三列REPAIR_TIE

    现在,绑定的维修都具有相同的REPAIR_TIE 编号,这将是最低的REPAID_ID

    我们现在可以轻松

    • 相互绑定维修(将所有REPAIR_TIE 更新到最低 REPAIR_ID)
    • 解开修复(将 REPAIR_TIE 设置回它自己的REPAIR_ID
    • 检查具有相同REPAIR_TIE 的所有维修是否具有相同的状态(或获得最低状态,或仍估计的工作天数,或...)

    【讨论】:

    • 太棒了!我知道我错过了一些东西 - 和 ;对于数据库来说,这不是一个好主意。感谢您的回复!
    • 现在就像其他人建议的那样:如果您有更多信息,您真的可以制作第三张桌子repair_ties。想法是一样的:修复中的行具有相同的值……等等。但是您可以在repair_ties(或orders 或其他)表中对具有相同值的字段进行“分组”。
    • 我在另一篇文章中使用了场景二中的解决方案 - 在我的情况下使用两个表效果更好,但我非常感谢您的帮助
    【解决方案3】:

    您可以创建一个具有一对多关联的新表,以按顺序对维修进行分组。

    【讨论】:

      【解决方案4】:

      每当修复完成时,对修复表中的 CustomerID 执行 select 语句,其中 RepairTable.Completed = False。如果没有结果,则将该记录添加到 CallList 表中。如果有结果,那么维修人员就知道客户有另一个开放维修。这条路线变得棘手的唯一方法是如果客户取消维修,在这种情况下,您必须针对 CallList 表运行最近完成的维修,以查看是否有任何未调用的(可能是 Returned 字段可以简化这一点)。

      【讨论】:

        【解决方案5】:

        正确答案取决于你。

        更好的方法是

        创建名为“order = {id, customer, status, advanced, savedby, editby, cancelledby, requestdate,cancelldate, updatedate } 的中间实体

        " and "orderdetail = {id, order, orderdetails,attendby, status_service, status, dateattended, note}"

        或使用不推荐

        逻辑很简单

        在 repais 中添加了名为 ordernumber 的列

        在 repais 中添加了名为 servicestatus 的列

        在 repais 中添加了名为 notshowagain 的列

        所以寻找已完成订单的客户

        select bla, bla
        from customer c
        
        inner join 
        (select customerid, ordernumber, count(*) services
        from repairs
        where repairs.status = {1 | 'A' | your status for entity}
        group by customerid, ordernumber
        ) order
        on order.customerid = c.id
        
        
        left join 
        (select customerid, ordernumber, count(*) servicesdone
        from repairs
        where repairs.status = {1 | 'A' | your status for entity}
        and servicestatus = 'COMPLETED'
        group by customerid, ordernumber
        ) orderdone
        on orderdone.customerid = order.customerid
        and orderdone.ordernumber= order.ordernumber
        
        where  order.services = orderdone.servicesdone
        

        -- 您是否有可以按状态或请求日期过滤的中间表“订单” -- 先进的百分比,由参加者,o 显示一些技术发现的笔记(在笔记中)

        现在可以

        1.-执行sql并标记寄存器如何“notshowagain”

        2.- 做用户标记(“notshowagain”)

        我更喜欢第二个

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-24
          • 1970-01-01
          • 2020-10-11
          • 1970-01-01
          • 2016-07-05
          相关资源
          最近更新 更多