在一个通用的List <t>对象中,我应该将'OrderID'存储在每个对象中,还是只依赖于列表中的顺序?</t>

时间:2009-11-05 10:41:38

标签: c# database-design oop

正如标题所说:)

在我的数据库中,我正在使用的表格有一个 OrderID 字段,该字段确定输出时将显示行的顺序(奇怪的是!)。

在C#代码中,这个数据表作为通用列表(List)加载,集合中的每个项目都是数据库表中行的副本。

因此,我应该在列表中的每个项目中都有 OrderID 字段,并将其用于订购。或者我应该只使用数据库中的OrderID来确定列表中对象的顺序。

要创建OrderID属性,这是问题

澄清: 填充列表时,用户将添加和删除项目以及更改现有项目的顺序。然后,这些数据将被保存回数据库。

5 个答案:

答案 0 :(得分:7)

他们总是会以同样的方式订购吗?例如,用户是否可以按字母顺序重新排序,然后要求您返回原始订单?如果是这样,保留OrderID是有意义的。

同样,如果您需要能够添加新项目,则需要能够正确定位。

就我个人而言,即使您现在不需要它,可能取得OrderID,只是因为它几乎不需要额外的努力并且以后会提供更大的灵活性 - 假设你不是非常记忆关键。当你拿到时,我仍然会让数据库进行排序,而不是取出然后对集合进行排序。

答案 1 :(得分:4)

是的,在项目本身上加上OrderID字段。它更安全,更灵活。

例如,您可以添加和删除项目,在客户端重新排序列表等,而不必担心丢失每个项目的正确OrderID。您还可以使用列表上下文之外的项目,而无需单独跟踪其OrderID

答案 2 :(得分:3)

我希望我的对象应该是完整的,无论它们是否在列表中 - 考虑从列表中拉出一个项目并在其他地方使用它,它的ID可能很重要。所以是的,ID的属性。

答案 3 :(得分:1)

如果需要订购,您也可以将其排除在外。但总的来说,我们需要它用于更新等。而且成本不是很大。

答案 4 :(得分:0)

我建议您在数据库中创建另一列来安排项目,而不是使用OrderID - 我在这里假设,可以用作数据库的行标识符/主键。

我会给你一个场景。

假设您有以下项目:

  • 订单ID 1-橙色
  • 订单ID 2 - Banana
  • 订单ID 3 - Apple

您已添加了另一项:

  • 订单ID 4 - 葡萄

如果用户删除了订单ID 2 - Banana,并希望订单ID 4- Grapes替换列表中的已删除项目,那么您将如何对其进行排序?至少如果您添加其他列,则可以保留商品的排序顺序,而无需触及订单ID。

另一方面,如果订单ID不是您的表的主键,并且您有不同的主键,那么请务必使用订单ID作为您的排序列。确保为排序列实现唯一索引,以便它可以增强数据库和应用程序性能。

为了使您在.NET中的排序更容易,您可以使用System.Collections.Specialized Namespace中的类对列表进行排序,并希望它用于强类型集合,即Dictionary,OrderedDictionary等,因为您将使用如果要实现排序顺序列,则为键/值对。

希望这有帮助!