【问题标题】:How to eliminate database table row duplication如何消除数据库表行重复
【发布时间】:2015-02-04 18:16:35
【问题描述】:

我有一个关于数据库以及如何显示有关主键和外键的信息的问题。

例如,有三个表; EmployeesEmployee_ticketsEmployee_comments。 每个employee可以有多个tickets,也可以有多个comments。外键放置在员工票和员工评论表中。我的应用程序是使用 Visual Studio 在 vb.net 中构建的,它是一个桌面应用程序。我如何查询说.. 员工姓名('Jon Doe')并在网格中显示他的所有票以及随着时间的推移人们在他身上制作的所有 cmets?我在 sql 数据库上创建了一个视图,它返回我需要的所有信息,但对于('Jon Doe')下列出的每张票,视图显示每张票的员工姓名。有没有办法只显示一次员工姓名,然后在该特定个人下列出的每张工单而不再次显示员工姓名,还是我必须制作单独的窗口来隔离所有这些?

这似乎是一个非常愚蠢的问题,我一生都无法弄清楚在这种情况下如何正确显示所需的内容。

这是我试图解释的一个例子:

因此,对于 troy,在 Employee Names 表中输入了一个员工姓名,在 CWB 表中输入了一张 CWB 票,但在 PQR Ticket 表中输入了两张 PQ 卡。我怎样才能只为 Troy 显示一行,为他的 CWB 显示一行,因为表格中只有一个,然后是他名下的 PQR 卡的两行?

我创建了一个视图,它将这些信息全部收集到一个视图本身中,然后将 datagridview 绑定到这个视图。

【问题讨论】:

  • 您可以用逗号分隔员工工单和员工 cmets 列中的结果,这样所有内容都应该在一行而不是多行。像这样:John Doe 2,3,4,5,6 Emp Comemnt,Emp Comment1,Emp Comment2,Emp Comment3
  • 当从数据库返回结果时,员工 cmets 和员工工单的数据将在一列中,并以逗号分隔,因此您将返回一行,并返回员工评论的所有结果和员工票将排成一行
  • 如何将视图与 DataGrid 绑定?
  • 我刚刚使用了 Datagrid 上的下拉菜单并选择了我创建的视图的绑定源。然后选择在每个网格中显示的列仅作为我试图询问的示例。

标签: mysql sql-server database vb.net


【解决方案1】:

您的问题与数据库无关。相反,问题在于您有一个实体(员工),该实体有两个与之关联的独立集合(tickets 和 cmets),并且您希望显示这两个集合的内容。

在数据网格中执行此操作很困难,因为在其最简单的化身中,它旨在显示一个类似项目的集合。

我能想到多种可能性:

  1. 在您的代码中,将每个集合转换为单个字符串值,并在包含员工姓名的行上显示该单个字符串值。这种转换可以是用逗号分隔集合中每个项目的字符串化版本(如 cmets 中的 BS123 所建议的那样),也可以只是一个摘要(例如“5 个门票”)。
  2. 将基本员工信息放在一个数据网格中,然后在其下方添加两个额外的数据网格,一个绑定到 Tickets 集合,一个绑定到 Comments 集合。
  3. 直接在主数据网格中嵌入数据网格,一个在Tickets 列,一个在Comments 列,并将每个网格绑定到员工中的相应集合。

你的数据库结构是正确的所以不要改变它,你只需要解决呈现的问题。

【讨论】:

  • 我只是在想也许可以在单独的视图中收集信息,然后将每个视图绑定到数据网格,然后它将显示一行的名称和该名称的每张票,我是否可以在在应用程序中绑定源以对齐每个条目的主键和外键?如何将多个数据网格嵌入到一个中?
  • 忘记主键、外键或任何与数据库有关的东西。当您在屏幕上显示信息时,您可能已经构建了与数据库分开的对象和对象集合。
【解决方案2】:

这里缺少的是视图和模型之间的控制器。您的视图准确地呈现了它所呈现的内容 - 由您来决定它的格式。

对此有多种可能的解决方案,而正确的解决方案部分取决于需求和基础设施。

如果您的基础架构稳固且您的需求接近实时,请考虑根据第一个表中选择的内容分别删除查询以填充您的第二个和第三个表。这会增加数据库的负载,但您的数据几乎总是正确的,并且数据将以您希望的方式来自数据库。

如果以数据库为中心的解决方案不适合您,LINQ 提供了一些很好的方法来将您的数据过滤到类型化的集合中,从而准确地呈现您希望用户看到的内容。

获取用户:

Dim users = From l In data.lines
            Group By FirstName = l.firstName, LastName = l.lastName
            Into Tickets = Group, Count()

然后您可以将此对象呈现给您的网格。虽然动态类型在这里有效,但我认为管理视图与已定义类的交互会更容易。我会把这部分留给你。在 LINQ 上进行一些搜索以填补其余空白。这是非常整洁的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2016-06-25
    • 2015-07-02
    相关资源
    最近更新 更多