【问题标题】:Mapping database structure from SQL Server to DynamoDB将数据库结构从 SQL Server 映射到 DynamoDB
【发布时间】:2017-11-01 15:28:49
【问题描述】:

我正在考虑使用 NoSQL 数据库来扩展数据库读取。请看下面的关系数据库结构:

CREATE TABLE Person(
      ID uniqueidentifier not null, 
      Name varchar(100), 
      DateOfBirth datetime)

CREATE TABLE Sport (
      ID uniqueidentifier not null, 
      Description varchar(50)) -- e.g. Football; Tennis; Badminton etc

CREATE TABLE PersonPlaysSport (
      PersonID uniqueidentifier FOREIGN KEY REFERENCES Person(ID), 
      SportID uniqueidentifier FOREIGN KEY REFERENCE Sport (ID), 
      primary key (PersonID, SportID)

在上面的示例中,一个人参加了许多运动。在我的实际应用中;我有这样的多对多关系,但表现不佳。

这些将如何存储在 NoSQL 文档数据库 (DynamoDB) 中?

【问题讨论】:

    标签: sql-server nosql amazon-dynamodb


    【解决方案1】:

    免责声明 - 我不熟悉 DynamoDb,但使用过其他几个 NoSql 数据库

    常见的做法是选择最重要的主题实体作为文档的root(在你的情况下,我会说这是Person

    然后为每个人创建一个文档,其中将包含所有关联实体(即关联运动)的“以人为中心”视图:

    Joe (Person, Keyed on a natural, or surrogate id).
    + Fields of Joe (Date of Birth, etc)
    + SportsPlayed: (Collection)
    --> Golf (Sport)
    --> Tennis (Sport)
    

    如果从以体育为中心的方法查看关系变得很重要(例如,您需要知道哪些人“订阅”了哪些体育):

    • 如果 NoSql 数据库允许,您可以尝试在 Person.Sport 上创建二级索引。这将允许诸如“谁打高尔夫球?”之类的查询,尽管这种方法在 NoSql 术语中通常不受欢迎。

    • 另外,最好创建第二个文档集合,这次以Sport 为关键字:

    Golf (Sport)
    - Joe
    - Jim
    ...
    

    等等。显然,当对PersonSport 或它们之间的关系进行更改时,要使两组文档保持最新,还有额外的工作要做,但是好处是读取方面的高性能 - 仅需要检索单个文档以提取整个实体图 - 在 SQL 术语中,这需要一个 Query 连接 3 个不同的表。

    【讨论】:

    • 谢谢。您将如何将 SQL Server 与 NoSQL 数据库同步?我正在考虑做这样的事情:enterprisecraftsmanship.com/2015/05/06/…,即在 NHibernate 中使用 EventListeners 和 Interceptors。但是,如果有更好的方法,我就徘徊了。
    • 另外,请问您是否有特定原因避免使用 DynamoDb?
    • 我们并没有避免使用 Dynamo - 只是我们主要使用 On Premise DB,例如 MongoDB、Riak、Aerospike 和最近的 Cassandra。对于云托管的 NoSql,我使用的是 Azure 的——例如TableStorage 和 DocumentDb。如果您已经在关系数据库中获得了大部分 master 数据,那么您可以尝试使用响应式流式处理方法来进行数据同步,而不是更改您的应用程序/过程,例如Sql Broker Notification Services 附近。
    • 谢谢。您如何看待我的链接中描述的方法。我使用 NHibernate 作为 ORM。但是,我可以切换到实体框架。这更像是我空闲时间的学习练习。
    • 我毫不怀疑它会正常工作。如果您已经将数据访问包装在 IRepository 类型层中,您还可以使用例如装饰器模式构建combo 存储库以保持同步。该领域的另一种常见方法是通过使用服务总线的事件驱动架构 - 例如。每当拥有“Person”数据的系统更改了 Person,它可以使用新的 Person 数据向总线发布消息,然后其他感兴趣的系统(例如 NoSql 支持的用户界面)可以订阅、塑造和存储数据需要的方式。
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多