将ORM与没有定义关系的数据库一起使用?

时间:2010-05-13 19:14:37

标签: nhibernate database-design orm datamapper

考虑一个由100多个表组成的数据库(MSSQL 2005),这些表具有在一定程度上定义的主键。表之间存在“关系”,但这些关系不会受外键约束的强制执行。

考虑以下我正在处理的典型表格类型的简化示例。用户和城市和省表之间是明确的关系。但是,它们的关键问题是表和命名约定中的数据类型不一致。

User:
    UserRowId [int] PK
    Name [varchar(50)]
    CityId [smallint]
    ProvinceRowId [bigint]

City:
    CityRowId [bigint] PK
    CityDescription [varchar(100)]

Province:
    ProvinceId [int] PK
    ProvinceDesc [varchar(50)]

我正在考虑重写使用此数据源的应用程序(在ASP.net MVC中),因为设计中的类似到MVC店面。然而,我正在经历一个概念验证阶段,这是我遇到的绊脚石之一。

  1. 在ORM选择方面我有哪些选择可以轻松使用?为什么?

  2. 我是否应该考虑使用ORM? (我之所以这样说的原因是,大多数解释和教程都与相对干净设计的现有数据库一起工作,或者与我的相比,新创建的数据库。我因此很难找到解决这个问题的方法)

  3. 存在大量现有的SQL查询,数据应用程序(例如IBatis.net)是否更合适,因为我们可以轻松地修改它们以便重新使用已经完成的投资?

  4. 我在SO上发现了this question,它向我表明可以使用ORM - 但是我觉得这是一个映射问题?

    注意:目前,对象模型没有明确定义,因为它不存在。现有系统几乎完成了SQL中的所有操作,或者包含过于复杂和大量查询以完成功能。我几乎是一个菜鸟,并且没有关于ORM和MVC的经验 - 所以这是一个很棒的学习曲线。

3 个答案:

答案 0 :(得分:1)

我同意本。

我在这种情况下使用LAMP堆栈。一个旧的脏的,糟糕的编码网站需要提供从头开始。它实际上是我见过的最糟糕的数据库,再加上一行又一行的盲执行。

工作?快速摆脱所有SQL并用抽象替换它。哪个ORM?我发现使用现有的ORM来回溯一个糟糕的数据库(大多数数据库)是一个坏消息。我认为这是ORM的一个问题,他们将数据库/存储问题更加接近应用程序...而不是更远。

我的解决方案:反射式ORM,仅使用现有数据库状态来计算出现的情况。所有选择,插入,更新和未使用的视图/存储的进程都可以屏蔽cruddy数据库。它由一个linq-esque API提供支持,只需重写严峻的SQL。将大约100klocs的SQL语句简化为低于2klocs。

专业人员:我可以逐步将数据库移植到视图和操作后面的更好的结构中。恕我直言,这就是应该如何组织所有数据库,充分利用SP和视图提供的抽象。我从不希望直接针对表看到单个SQL语句(或伪装成SQL的ORM)。

那是我的故事。一种过度设计的方法,可以在现有和废话数据库上方插入一个漂亮的抽象,而无需首先重写数据库,也不会让ORM陷入混合,使事情变得更加复杂。

一个黑客,毫无疑问,但它运作良好我在项目中使用它,无论如何我都可以从头开始设计数据库;)

答案 1 :(得分:0)

尝试保留现有架构然后将其置于更加结构化的orm模式所涉及的工作量可能会很大且复杂。如果您正在重写整个系统并重新使用旧系统,那么我将设计我的数据模型创建一个新的数据库和一组类,可能使用linq2sql,然后编写数据迁移脚本以将数据从旧模式移动到新模式。这样,您的复杂的繁琐代码就全部在迁移中,您不必处理维护和管理结构化类模型与设计糟糕的数据库之间的复杂映射。

答案 2 :(得分:0)

我们刚刚遇到了一个糟糕的架构设计问题(随机拥有主键,根本没有外键,设计糟糕的表 - 只是一团糟)。

我们拥有丰富的技术选择,并且进入MVC2前端(与您的问题无关),并且有2个开发人员分开 - 一个尝试使用NHibernate建模,另一个使用Entity Framework 4。

我必须补充一点,我们对我们想要的域模型有一个强烈的想法,并首先建模(不想受数据库约束),所以从架构的角度看我们的'User'对象实际上是跨越5个表,我们封装了许多业务逻辑,以便域模型不是动态的,一旦我们对User对象感到满意,我们就开始尝试插入ORM。

我可以毫不犹豫地说,在这两种情况下(NH和EF4),我们必须在我们的模型上做出妥协才能实现真正的实施。我会给你EF4的例子,因为那是我最密切参与的一个例子,其他人可以将这些与其他ORM联系起来。

私人制定者

不 - 不是EF4的生活。您的财产必须是公开的。有一些解决方法(例如,创建来自数据库的属性的包装器)

<强>枚举

同样,没有 - 有一个包装概念和一个'映射'试图从数据库中获取一个查找int到模型枚举类型。

<强>结果

我们用两种方法坚持了一段时间,以达到我们完成用户映射的程度,结果是我们不得不以太多方式妥协我们的域模型。

我们去哪儿了?

使用我们自己的映射层Linq to SQL。而且我们从未回头 - 绝对太棒了 - 我们自己编写了一个映射层,它将Dto对象放在Dal层并将其映射(我们指定它)到我们的域模型中。

对ORM的任何调查都祝你好运,如果我有一个体面的架构可以重新调查它们,我肯定会重新调查它们,但是就目前而言,使用糟糕的架构,我们更容易推出自己的架构。

干杯, 特里