2010-06-08 114 views
1

如果我要从我的解决方案中解脱出我当前的成员资格提供者,即作为一个dll,并将其作为一个Web服务与它自己的数据库一起公开,那么如何建立关于SOA的关系设计。关于数据库关系的SOA设计原则

例如

我有一个表:

USER ID,姓名,姓氏,用户名,密码,角色。

和表

产品

id, name, price, createdate, userid

外键存在用户ID表用户。

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

如果我想获得的是上载今日例如所有的产品,之前,我会质疑:

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' 

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

回答

0

据我所知,你有两个服务,一个与用户和另一个与产品,当然你不想连接这些服务。

我认为你应该用另一种服务编排这两种服务,并在该编排服务中从产品服务中收集产品,并在用户服务之后调用用户名。

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

+0

这些产品在其他需要引用服务中用户的实体中。用户过去常常在数据库中使用外键关系,但我将其取出以便将会员服务分发给其他应用程序。 我可以调用产品表,然后对于每一行调用将userid传递给服务并检索用户,我只是在想这会导致糟糕的性能。 – Eitan 2010-06-08 09:31:35

0

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

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

相反,我采取了一种CRUD数据服务的方法,该服务返回一个单一的实体bean集合,并说我需要的只读查询的集合,我有一个查找服务。其中需要一个查找名称说'LookupAllProductsUploadedToday'并将其映射到一个数据库存储过程(消除了可怕的动态sql!的需要),返回的数据集然后变成一个查找bean,它基本上是一个键/值对的集合和发送退出应用程序的服务。

出于安全考虑,我非常喜欢存储过程,因为只有读取和执行存储过程的权限并且拒绝执行动态sql语句。我开发了各种SOA应用程序,并且不需要使用此方法编写任何内联SQL。