【问题标题】:SOA design principles with regards to database relationships关于数据库关系的 SOA 设计原则
【发布时间】:2010-06-08 08:31:43
【问题描述】:

如果我要从我的解决方案中提取我当前的成员资格提供程序,即作为一个 dll 并将其公开为一个带有它自己的数据库的 Web 服务,我将如何建模与 SOA 设计相关的关系。

例如

我有一张桌子:

用户 id、姓名、姓氏、用户名、密码、角色。

和桌子

产品

id, name, price, createdate, userid

外键是表用户的用户标识。

我将如何建模关系和/或查询数据库。

如果我想获取今天上传的所有产品,例如,在我查询之前:

SELECT u.name, u.lastname, u.username, p.* FROM PRODUCT p INNER JOIN USER u ON p.userid = u.id WHERE createdate = '05/05/2010'

现在我在数据库中没有表,我将如何执行此查询?

【问题讨论】:

    标签: architecture membership soa orm


    【解决方案1】:

    据我了解,您有两种服务,一种与用户有关,另一种与产品有关,当然您不想连接这些服务。

    我认为您应该将这两个服务与另一个服务进行编排,并在该编排服务中从产品服务中收集产品,然后调用用户服务以获取用户名。

    如果它破坏了您的性能,您可以“非规范化”您的服务,将名称添加到产品实体或缓存等。但我会尽可能避免这种情况。

    【讨论】:

    • 产品在需要引用服务中用户的其他实体中的应用程序中。用户曾经在具有外键关系的数据库中,但我将其取出以便将会员服务分发给其他应用程序。我可以调用产品表,然后为每一行调用将用户 ID 传递给服务并检索用户,我只是认为这将是糟糕的表现。
    【解决方案2】:

    我会采取完全不同的方法。

    您经常发现,当程序员编写内联动态 sql 时,它是为了获取数据的只读视图。因此,当您只需要只读访问时,为什么要填充可以带回 n 行的重型实体 bean?如果您正在处理 Web 服务,则尤其如此。

    相反,我采用的方法是让一个 CRUD 数据服务返回单个实体 bean 和一个实体 bean 的集合,比如产品,对于我需要的只读查询,我有一个查找服务。它接受一个查找名称“LookupAllProductsUploadedToday”并将其映射到一个数据库存储过程(消除了对可怕的动态 sql 的需要!)然后将返回的数据集转换为一个查找 bean,它基本上是一个键/值对的集合并发送退出应用程序的服务。

    出于安全原因,我非常喜欢存储过程而不是内联 sql,因为您只能授予存储过程的读取和执行权限,并拒绝访问执行动态 sql 语句。我开发了各种 SOA 应用程序,并且不需要使用这种方法编写任何内联 sql。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多