如何消除数据库表行重复

时间:2014-12-06 18:50:30

标签: mysql sql-server database vb.net

我对数据库以及如何显示有关主键和外键的信息有疑问。

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

这似乎是一个非常愚蠢的问题,我不能为我的生活找出如何正确显示在这种情况下所需要的。

以下是我要解释的示例:enter image description here

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

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

2 个答案:

答案 0 :(得分:2)

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

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

我可以想到许多可能性:

  1. 在您的代码中,将每个集合转换为单个字符串值,并在具有员工姓名的行上显示该单个字符串值。这种转换可以用逗号分隔集合中每个项目的字符串化版本(如评论中BS123所建议的那样),也可以只是一个摘要(例如" 5门票")。
  2. 将基本员工信息放在一个数据网格中,然后在其下面放置两个额外的数据网格,一个绑定到Tickets集合,另一个绑定到Comments集合。
  3. 直接在主数据网格中嵌入数据网格,一个在Tickets列中,一个在Comments列中,并将每个数据网格绑定到员工中的相应集合。
  4. 您的数据库结构是正确的,所以不要改变它,您只需要解决演示问题。

答案 1 :(得分:0)

您在这里缺少的是视图和模型之间的控制器。您的视图正好呈现了呈现的内容 - 您可以对其进行格式化。

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

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

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

获取用户:

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

然后,您可以将此对象呈现给网格。虽然动态类型在这里工作,但我认为管理与已定义类的视图交互会更容易。我会把那部分留给你。在LINQ上做一些搜索以填补剩下的空白。它非常整洁。