在我的情况下,单独的系统是一个Web服务(但可以想象它可以是任何东西)。 我的问题是,当涉及数据时,如果将Web服务集成到一个单独的系统中,最佳做法是什么?
示例:Web服务提供产品列表。产品按类别分组。您可以获得子类别中的所有产品。您可以通过其id(整数)或其名称(唯一值)获取特定产品。
在我的申请中:
我显示类别和产品列表 - 用户可以选择产品并指定订单数量。
我应该存储类别名称还是类别ID?
我应该存储产品名称还是产品ID?
如何命名存储来自Web服务的数据的数据库中的字段 (CategoryId或WsCategoryId:按照惯例,人们知道价值来自何处?)
还有其他最佳做法吗?
还有其他参考资料吗?
答案 0 :(得分:2)
从您的问题我了解到Web服务的界面如下所示:
/product/
/product/{ProductId}
/product/{ProductName}
/product/category/{CategoryId}
由于您询问是否应存储CategoryName
,我认为它是唯一的(与ProductName
相同)。
我还假设Web服务处理透明地重命名产品或类别的情况(即通过提供重定向或任何其他方法,允许您检测并相应地处理它)。如果没有,请不要考虑将名称存储为对产品或类别的引用 - 始终使用ID。
我会为您的问题#1和#2 提供相同的答案。尽管ProductName
和CategoryName
的唯一性在技术上允许您将它们作为产品和类别的唯一标识符存储在应用程序中,但我会选择存储其ID。主要决策点是您的存储介质。由于您使用的是数据库,并且Web服务允许您通过唯一的数字ID访问对象,因此应该应用数据库规范化规则 - 因此您应该存储ID 。
上面假设您正在使用关系数据库 - 如果您使用的是NoSQL数据库,我认为存储名称而不是ID也是一个可行的选择(至少就我现在所说的而言)理解NoSQL解决方案,遗憾的是我还没有任何实际经验。)
关于问题#3 - 我会坚持您已经在数据库中使用的命名约定。在那里命名表和列有许多不同的约定,所以我真的怀疑有关如何命名引用Web服务对象的列的标准化约定。我会根据您现有的命名惯例对其进行命名,并且对于使用该系统的所有人来说,列的目的是明确的。请注意,如果您将来可能会使用其他Web服务,则应考虑在列名中保留服务名称,而不是使用通用ws
前缀 - 例如AmazonProductId
或AmazonCategoryId
。
我会尝试从我的经验中指出一些项目,但我不会将它们标记为最佳做法 - 只是要考虑的主题。
根据我的经验,我发现以与数据库中的数据相同的方式处理来自Web服务的数据是有用的 - 至少从应用程序的角度来看,存储层将从应用程序逻辑中抽象出来。我的意思是,无论您的存储介质是数据库还是Web服务,您都应该考虑并准备类似的方案。 与数据库相同,Web服务可能会关闭,两者都可能导致数据或完整性损坏,这两者都需要您对输入数据进行清理或处理。
缓存数据应该是列表中的一个项目 - 除了显而易见的性能原因外,它还可以让您处理Web服务的中断(限制在哪一个范围内)您缓存的数据。) 例如,您的应用程序会在您的应用程序中显示最常购买产品的列表产品。如果您的应用程序仅存储产品的ID,则必须对Web服务执行一个或多个请求,以便检索您需要在列表中显示的所有产品的名称。如果您在本地或数据库中缓存产品名称,您将获得更好的性能,节省资源,并且在Web服务出现故障的情况下您也将拥有故障安全方案。
参照完整性是使用Web服务时要考虑的另一个重要方面。由于Web服务与数据库完全分离,因此您无法像在仅数据库解决方案中那样创建外键。这意味着Web服务中的数据更改(即产品更新或删除)可能会破坏数据库中数据的完整性。
关于引用,这些主要取决于您将要使用的Web服务的类型(您没有指定要使用的服务)。如果服务基于REST原则,我可以推荐Restful Web Services by Leonard Richardson and Sam Ruby。尽管它并不专注于应用程序/服务集成,但它是REST的一个很好的介绍。