0

我搜索在某种情况下创建实体的最佳实践。

有一个样本:

我们在一个数据库中有 4 个表。

Table Server
id
name
...

Table Environment
id
name

Table Application
id
name
...

Table JCT_Application_Server_Environment
idApplication
idServer
idEnvironment

我们有 3 个表由 1 个表链接(JCT_Application_Server_Environment)

我的系统(在 asp.net 中)需要显示应用程序的“服务器”列表。

那么,我应该使用如下实体:

V1

class JCT_Application_Server_Environment
public idApplication
public idServer
public idEnvironment

对于每个项目,我都会加载服务器和环境。每次加载数据网格都将是“困难的”。就我的目的而言,我认为这不是好事。


或者更好地创建一个实体:

V2

class JCT_Application_Server_Environment
    public ApplicationName
    public ServeurName
    public EnvironmentName

你有你需要的。很简单,取最小值。如果您需要更多,请花更多时间去做。

如果您有很多属性,则执行实体将需要时间。并且每个属性都已经在另一个实体(原始应用程序/服务器/环境)中创建。


或者可能

V3

class JCT_Application_Server_Environment
    public Application //As Application entity
    public Server     //As Server entity
    public Environment //As Environment entity

Sub New(row as datarow) //each New do a GetElementById on Database
   me.Application = New Application(row("idApplication"))
   me.Server = New Server (row("idServer "))
   me.Environment = New Environment (row("idEnvironment "))

一开始需要时间来加载,但得到你需要的东西,也许更多。Datagrid 只需要知道取子值(Server.Name/Environment.Name)


第一个主要用于导入/导出系统。对于 webView,它不是我常用的版本,因为我更喜欢轻松处理 gridview 数据绑定。

第二个使用得更频繁,但实体仅用于一件事。1 个实体对应 1 个网格视图。实际情况适合第二个版本。我只是想知道第二个还是第三个更好。具有 .net 经验的开发人员通常会做什么。

如果您有任何其他选择,您可以将其发布为答案。


对于我的实际项目,我决定使用 V3,但仅用于容器。数据由 DAL 填充。

达尔做类似的事情

function GetList() as List(Of JCT_Application_Server_Environment)

Get List of Application_Server_Environment containing id's

for each item
grab Application, Server and Envirenment by id
create a new JCT_Application_Server_Environment with those 3
add to list of JCT_Application_Server_Environment

return list
4

1 回答 1

0

您在此处列出的选项我觉得从以数据为中心的角度来解决问题。您设计的表模式采用第 3 范式 (3NF),可以说是在关系数据库中建模数据的标准方法。

尝试在应用程序实体中对此进行建模时会遇到麻烦,因为数据在数据库中的建模方式与您希望在应用程序中对其建模的方式之间存在阻抗不匹配。3NF 数据建模意味着,为了水合您的一个或多个实体(我将称它们Process为实体,因为没有更好的词,因为它们代表在环境中的服务器上运行的应用程序)将有3个表之间的内部连接以获取所需的数据。最重要的是,这三个表中可能还有其他字段有时我们想要返回,而有时我们不想返回(我们可能不需要它们),这使问题更加复杂。

现在我对您的应用程序一无所知,但是看着这个,我倾向于从以应用程序(以及实体)为中心的角度对此进行建模。上述问题很大程度上是NHibernateEntity Framework等对象关系映射(ORM)框架存在的原因。现在,这可以映射到一张表,但我有一些问题:

  1. 有固定的环境吗?
  2. 有固定的服务器吗?
  3. 有固定的应用程序集吗?

如果这些都是真的,最简单的方法可能是enum为每个定义一个并将三个枚举包含在一个实体中

public class Process
{
    public int Id { get; set; }
    public Environment Environment { get; set; }
    public Application Application{ get; set; }
    public Server Server { get; set; }
}

然后有一个Processes表来存储这些值。

如果服务器、应用程序或环境中的任何一个会发生变化,那么我会问它们多久会发生一次变化?

如果它们不经常更改,那么仍然可以使用简单的方法并根据需要维护应用程序/数据库。

如果它们经常更改,那么您建议的更规范化的数据库结构可能是要走的路。现在您可以编写原始 ADO.NET 来提取数据,但我建议您查看DapperSimple.DataMassive之类的东西来帮助解决此问题,然后将您的 DataGrid 绑定到您的实体集合。根据您需要每个表中的哪些字段以及需要该数据的频率,您最终可能会使用几种不同类型的稀疏模型来表示来自数据库的部分数据,或者您可能会选择返回dynamic类型并知道对于给定的上下文,您可以访问哪些属性,或者您可能每次都返回完全水合的实体。每种方法在性能有用性和可维护性方面都有权衡,您选择哪种方法实际上取决于对应用程序的了解更多。

我希望我已经提出了一些有趣的问题来思考,并就如何处理这个有点棘手的问题给出了一些有用的建议。

于 2013-07-05T13:40:18.920 回答