2

我想知道什么是最好的,或者是否有更多的可能性。我正在从数据库中检索数据,例如,我需要存储 IDS 和 NAMES。最好将它们存储在索引“同步”的不同数组中,例如(Vb.net):

Dim ids As New List(Of Integer)()
Dim sCods As New List(Of String)()

For each elem In dataBaseData
    ids.Add(CInt(elem("id")))
    sCods.Add(elem("cod").ToString())
Next

所以我知道第 3 个位置的索引上的 id 对应于另一个数组上的相同索引。或者最好这样做:

Dim sCods As New Dictionary(Of Integer, String)()

For each elem In dataBaseData
    sCods.Add(CInt(elem("id")), elem("cod").ToString())
Next

现在假设我也必须存储子元素。我的意思是,对于每个 id,一个元素列表,所以字典将类似于:

Dim sSubs As New Dictionary(Of Integer, List(Of String))()

只需使用数组:

Dim sSubs() As New List(Of String)()
Dim sOneSub As String = sSubs(idIndex)(subIndex)

然后想象有很多数据要检索。我将示例放在 Vb.Net 中,但只有示例。

4

1 回答 1

5

正如您所描述的,将数据存储在单独的“同步数组”中肯定是不好的做法。这不是一个好主意的原因有很多:

  • 它不是自记录的——代码的结构没有什么明显的迹象表明一个数组中的第 3 项存储与另一个数组中的第 3 项相同的对象的数据。因此,使这一点显而易见的唯一方法是在代码中添加注释,解释数据的存储方式和原因。虽然评论绝对是一件好事,但不需要评论更好。

  • 您无法轻松引用数据- 您打算如何从数据访问层返回这些数据?您打算如何将其作为参数传递给业务层方法?要获取所有数据,您必须传递所有列表。要从列表中传递单个对象的数据,您必须将所有数据作为单独的变量传递。

  • 它不灵活- 当您以这种方式存储它时,很难为您的对象添加新属性。例如,现在,您可能只需要为每个对象存储一个 ID 和一个描述,但是当您还需要存储一个日期时会发生什么?您不仅需要添加一个新的列表/数组来存储所有加载对象的日期,而且还必须修复使用和传递数据的所有地方。以及如何找到代码中需要修复的所有位置?这也不容易做到,因为您可以搜索的对象没有特定的数据类型。

  • 它很脆弱- 由于已经提到的所有原因,以及更多原因,这样存储数据会导致代码错误。如果列表不同步会发生什么?如果您未能在对象中途加载数据,因此只有部分列表得到更新,会发生什么情况?如果您需要从列表中删除一个项目并且由于某种原因仅在其中一个列表上失败怎么办?如果多个线程需要同时修改数据怎么办?如果你不是特别小心,事情很容易出错。没有必要让您的代码如此脆弱,那么为什么要给自己不必要的麻烦呢?

那么更好的解决方案是什么?好吧,这Dictionary绝对是一个更好的选择,但在这种情况下,它可能仍然会被误导。如果您只需要为每个对象存储两个数据元素,则不需要字典。字典的目的是存储键/值对,您需要能够快速访问给定键的值。该字典使用哈希表来索引列表,以使键查找非常快速。但是如果使用不当,它实际上会降低效率(即更多内存,由于哈希码生成而变慢)。

为对象或实体(有时在 DB 设计中称为)存储数据的正确方法是创建一个类。这些类通常称为数据传输对象 (DTO) 类。例如:

Public Class MyEntity
    Public Property Id As Integer
    Public Property Code As String
End Class

然后,您可以轻松地将数据存储在您想要的任何类型的列表中,例如:

Dim entityArray() As MyEntity  ' Arrays are great for storing lists which don't change in length very often
Dim entityList As List(Of MyEntity)  ' Lists are great when the number of items in the list keeps changing
Dim entityDictionary As List(Of Integer, MyEntity)  ' Dictionaries are great when you need to quickly access items by their key (their ID, in this case)
Dim entityQueue As Queue(Of MyEntity)  ' Queues are great when you need to process incoming items in the order that they were received
' Etc.

现在,当你需要返回一个MyEntity对象时,你可以返回它As MyEntity。当您需要返回它们的列表时,您可以将它们作为单个列表返回。将它们作为参数传递给方法时也是如此。

此外,当您需要向实体添加新属性时,只需将其添加到 DTO 类中,如下所示:

Public Class MyEntity
    Public Property Id As Integer
    Public Property Code As String
    Public LastModified As Date  ' Hey look! A new field.
End Class

现在所有使用该数据类型的代码都将立即可以访问该新属性。您所要做的就是用数据填充该字段。如果您想在代码中查找所有使用该数据类型的位置,只需右键单击MyEntity类名并从上下文菜单中选择Find All References选项。

正如其他人所提到的,有一些框架可用于创建实体类并将它们读取和写入数据库。我想说,在我写这篇文章的时候,Entity Framework 和 NHibernate 是两个最流行的选项。它们当然值得考虑,但在开始使用框架之前,充分了解框架在做什么以及为什么需要它总是很重要的。因此,我建议您至少尝试自己正确地进行数据访问层一段时间,然后再开始寻找偷工减料的方法。使用让您的生活更轻松的框架并没有错,但是如果您不正确地使用任何框架或出于错误的原因,它们可能会使您的生活更加困难,而不是更轻松。

于 2013-02-25T13:39:54.850 回答