标签: denormalization

如何处理NoSQL中重复数据的更改

我们正在为即将到来的项目评估NoSQL.我倾向于以RDBMS的方式思考问题,并且难以概念化缺乏规范化.

我知道在NoSQL中重复数据不算错误.我无法理解的是修复数据更改以防止出现异常.

问题解释示例:

您正在组织一系列扑克锦标赛.您有球员,位置和锦标赛事件.据我了解,锦标赛活动可能包含一个位置和一组球员.它不需要拥有所有玩家数据,但如果你想获得每个人参加下一场锦标赛的名字和家庭住址,那么这些信息应该在锦标赛中.

有人已经结婚并搬家,改变他们的姓氏和地址.应用程序是否需要更新播放器集合和锦标赛集合?或者我的收藏模型错了吗?开发人员如何"跟踪"信息重复的位置?

denormalization nosql

15
推荐指数
2
解决办法
2357
查看次数

如何在Doctrine MongoDB ODM中正确处理非规范化数据同步

使用MongoDB时,引用数据的非规范化似乎是一种非常常见的做法.然而,我没有看到使用Doctrine MongoDB ODM处理它的任何内置方法.

假设我有一个社交网络,用户可以互相关注,这里有两个示例用户:

{
  _id : id1,
  name: "Malcolm Reynolds",
  followed: []
}

{
  _id : id2,
  name: "Zoe Alleyne",
  followed: [
    { _id: id1, name: "Malcolm Reynolds" }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我希望'name'属性被非规范化.正如我所说,Doctrine ODM似乎没有内置的方法来做到这一点.由于关于这个问题的最新一期是一年,我会尝试自己做.

虽然我在互联网上发现了很多文章,解释了非规范化在什么情况下是有用的,并提到如何保持非规范化数据的一致性,但我没有找到解释如何实现真正的数据更新过程.

在我的情况下,最终一致的数据就足够了,用户名更新和非规范化数据更新之间可能会有几个小时.我可以看到3种不同的方法:

1 - 一致性检查程序:让 后台运行的任务定期更新非规范化数据.

2 - 更新触发器: 名称字段上的每次更新都会在单次刷新中更新所有关联的非规范化数据.

3 - 混合解决方案 对于每个用户,当更新名称时,会将一个条目添加到具有更新信息的队列中(用户更新和队列中的插入将在单个刷新中进行),并且运行任务后台做了实际的更新.

第一个解决方案似乎是最容易实现的,但正如我所看到的那样,它可能非常耗费资源.第二种解决方案会使更新请求变得非常长,即使读/写比率很高,我也可能会遇到这个问题.我认为第三种解决方案是要走的路,我这样认为是对的吗?

另外,我想以干燥的方式进行,例如,我希望不必在preUpdate回调中为每个数据非规范化的Document重写相同的代码.我正在考虑制作自定义注释,这是一个好主意吗?

denormalization mongodb doctrine-odm doctrine-mongodb

15
推荐指数
0
解决办法
522
查看次数

NOSQL非规范化数据模型

我多次读到NOSQL数据库中的数据存储为非规范化.例如,考虑国际象棋游戏记录.它不仅可以包含参与国际象棋游戏的玩家ID,还可以包含该玩家的名字和姓氏.我想这样做是因为在NOSQL中无法进行连接,因此如果您只是复制数据,您仍然可以在一次调用中检索所需的所有数据,而无需手动应用程序级别处理数据.

我不明白的是,现在当你想要更新国际象棋选手的名字时,你必须编写一个查询来更新该玩家参与的国际象棋游戏记录以及该玩家的玩家记录.这似乎是一个巨大的性能开销,因为数据库必须搜索该玩家参与的所有游戏,然后更新每个记录.

数据是否经常像我的例子一样存储为非规范化?

database denormalization nosql denormalized

14
推荐指数
1
解决办法
5751
查看次数

如何在MySQL中找到最流行的单词出现?

我有一个叫results5列的表.

我想使用该title列来查找所说的行:WHERE title like '%for sale%'然后列出该列中最常用的单词.一个会是for另一个会是,sale但我想看看其他单词与此相关.

样本数据:

title
cheap cars for sale
house for sale
cats and dogs for sale
iphones and androids for sale
cheap phones for sale
house furniture for sale
Run Code Online (Sandbox Code Playgroud)

结果(单个单词):

for    6
sale    6
cheap    2
and    2
house    2
furniture 1
cars    1
etc...
Run Code Online (Sandbox Code Playgroud)

mysql sql denormalization

14
推荐指数
2
解决办法
1803
查看次数

Google App Engine中的非规范化?

背景::::

我正在使用谷歌应用引擎(GAE)进行Java.我正在努力设计一个能够发挥大表优势和劣势的数据模型,这些是之前的两个相关帖子:

我暂时决定在一个完全规范化的主干上,将非规范化属性添加到实体中,这样大多数客户端请求只能用一个查询来处理.

我认为完全规范化的主干将:

  • 如果我在非规范化中编码错误,请帮助维护数据完整性
  • 从客户端的角度启用一次操作中的写入
  • 允许对数据进行任何类型的意外查询(假设有人愿意等待)

而非规范化数据将:

  • 使大多数客户端请求能够非常快速地得到服务

基本非规范化技术:::

我观看了一个app引擎视频,描述了一种被称为"扇出"的技术.我们的想法是快速写入规范化数据,然后使用任务队列完成幕后的非规范化,而无需客户端等待.我已将视频添加到此处以供参考,但它只需一小时,而且无需观看它就能理解这个问题:http: //code.google.com/events/io/2010/sessions/high-throughput -data-管道,appengine.html

如果我使用这种"扇出"技术,每次客户端修改一些数据时,应用程序将在一次快速写入中更新规范化模型,然后将非规范化指令发送到任务队列,这样客户端就不必等待他们也完成了.

问题:::

使用任务队列更新数据的非规范化版本的问题在于,在任务队列完成对该数据的非规范化之前,客户端可以对刚刚修改的数据发出读取请求.这将为客户端提供过时的数据,这些数据与他们最近的请求混淆客户端并使应用程序显得有问题.

作为补救措施,我建议通过URLFetch异步调用应用程序中的其他URL来并行扇出非规范化操作:http://code.google.com/appengine/docs/java/urlfetch/ 应用程序将等到所有在响应客户端请求之前已完成异步调用.

例如,如果我有一个"约会"实体和一个"客户"实体.每个约会将包括其预定的客户信息的非规范化副本.如果客户更改了他们的名字,那么该应用程序将进行30次异步调用; 每个受影响的约会资源一个,以便更改每个客户的名字副本.

从理论上讲,这可以全部并行完成.所有这些信息都可以在大约花费1或2次写入数据存储区所需的时间内更新.在非规范化完成后,可以对客户端做出及时响应,消除客户端暴露于不一致数据的可能性.

我看到的最大的潜在问题是,应用程序在任何时候都不能有超过10个异步请求调用(此处记录):http://code.google.com/appengine/docs/java/urlfetch/overview .html).

建议的非规范化技术(递归异步扇出):::

我提出的补救措施是将非规范化指令发送到另一个资源,该资源递归地将指令拆分成相等大小的较小块,用较小的块作为参数调用自身,直到每个块中的指令数足够小以便完全执行.例如,如果具有30个关联约会的客户更改了其名字的拼写.我将使用指令更新所有30个约会来调用非规范化资源.然后,它将这些指令分成10组3条指令,并使用每组3条指令向其自己的URL发出10个异步请求.一旦指令集小于10,资源就会根据每条指令直接发出异步请求.

我对这种方法的担忧是:

  • 它可以被解释为试图规避app引擎的规则,这会导致问题.(它甚至不允许URL调用自己,所以我实际上必须有两个URL资源来处理相互调用的递归)
  • 它很复杂,有多个潜在的失败点.

我真的很感激这种方法的一些意见.

java google-app-engine database-design bigtable denormalization

13
推荐指数
1
解决办法
1628
查看次数

使用symfony 2序列化器对对象中的嵌套结构进行非规范化

我正在使用版本2.8的Symfony 2项目,我正在使用内置组件Serializer - > http://symfony.com/doc/current/components/serializer.html

我有一个由Web服务提供的JSON结构.反序列化后,我想在对象中反规范化我的内容.这是我的结构(汽车应用程序上下文中的模型/品牌).

[{
"0": {
    "id": 0,
    "code": 1,
    "model": "modelA",
    "make": {
        "id": 0,
        "code": 1,
        "name": "makeA"
    }
  }
} , {
 "1": {
    "id": 1,
    "code": 2,
    "model": "modelB",
    "make": {
        "id": 0,
        "code": 1,
        "name": "makeA"
    }
  }
}]
Run Code Online (Sandbox Code Playgroud)

我的想法是填充一个VehicleModel包含对象引用的VehicleMake对象.

class VehicleModel {
    public $id;
    public $code;
    public $model;
    public $make; // VehicleMake
}
Run Code Online (Sandbox Code Playgroud)

这是我做的:

// Retrieve data in JSON
$data = ...
$serializer = new Serializer([new ObjectNormalizer(), …
Run Code Online (Sandbox Code Playgroud)

php json denormalization symfony

13
推荐指数
1
解决办法
8830
查看次数

Cassandra非规范化数据模型

我读到在nosql(例如cassandra)中,数据通常存储为非规范化.例如,请参阅此SO答案或本网站.

例如,如果您有一系列员工和部门,并且您想要执行查询:select * from Emps where Birthdate = '25/04/1975' 那么您必须创建一个列系列birthday_Emps并将每个员工的ID存储为一列.那么你可以在birthday_Emps系列中查询密钥'25/04/1975',并立即获得该日出生的员工的所有ID.您甚至可以将员工详细信息归一化为birthday_Emps,以便您立即拥有员工姓名.

这真的是这样做的吗?

  1. 无论何时删除或插入员工,您都必须从birthday_Emps中删除该员工.在另一个例子中,有人甚至说过,有时你会遇到某种情况,一些表中的删除需要100个其他表中的删除.这真的很常见吗?

  2. 在应用程序代码中进行连接是否常见?您是否拥有允许您创建预先编写的应用程序以将来自不同查询的数据连接在一起的软件?

  3. 是否有处理这些数据模型问题的最佳实践,模式等?

database join denormalization cassandra nosql

11
推荐指数
1
解决办法
5162
查看次数

触发器与非规范化存储过程的优缺点

当涉及在事务数据库中对数据进行非规范化以提高性能时,存在(至少)三种不同的方法:

  1. 通过存储过程推送更新,存储过程更新规范化的事务数据和非规范化的报告/分析数据;

  2. 在更新辅助表的事务表上实现触发器; 这几乎总是维持历史时所采取的路线;

  3. 将处理推迟到夜间批处理过程,可能将ETL放入数据集市/仓库.

让我们假设为了这个问题的目的,选项#3是不可行的,因为域要求非规范化数据始终与规范化数据一致.我经常处理的分层聚合就是其中的一个例子.

我已经使用了前两种方法中的两种方法,最近我一直倾向于基于触发器的方法,但我想知道是否有任何"陷阱"我尚未发现,并认为它值得问这个问题所以我在将来作出长期决定时会记住一些想法.

那么根据您的经验,这两种工具的优缺点是什么,以保持实时非规范化数据的特定目的?在什么情况下你会选择一个而不是另一个,为什么?

(PS请不要回答"触发器过于复杂"或"所有更新应始终通过存储过程" - 使其适合问题的上下文.)

database triggers stored-procedures denormalization sql-server-2008

10
推荐指数
2
解决办法
2万
查看次数

如何定期重建频繁访问的报告表?

刷新准备好的报告表大约需要5-10分钟.我们希望不断更新此表(可能每15分钟或连续一次).

我们非常频繁地查询此报告表(每分钟多次),并且我无法在任何时间内保持这种状态.如果数据是15分钟就可以了.

我不能放弃桌子并重新创建它.我无法删除表的内容并重新创建它.

有没有我应该使用的技术,比如在两个表之间交换(在我们构建另一个表时从一个表读取)或者我将这个5-10分钟的过程放在一个大型事务中?

t-sql sql-server reporting denormalization

10
推荐指数
1
解决办法
1700
查看次数

可以使用SQLAlchemy事件来更新非规范化数据缓存吗?

出于性能原因,我有一个非规范化数据库,其中一些表包含从其他表中的许多行聚合的数据.我想通过使用SQLAlchemy事件来维护这个非规范化的数据缓存.例如,假设我正在编写论坛软件,并希望每个Thread人都有一个列跟踪线程中所有注释的组合字数,以便有效地显示该信息:

class Thread(Base):
    id = Column(UUID, primary_key=True, default=uuid.uuid4)
    title = Column(UnicodeText(), nullable=False)
    word_count = Column(Integer, nullable=False, default=0)

class Comment(Base):
    id = Column(UUID, primary_key=True, default=uuid.uuid4)
    thread_id = Column(UUID, ForeignKey('thread.id', ondelete='CASCADE'), nullable=False)
    thread = relationship('Thread', backref='comments')
    message = Column(UnicodeText(), nullable=False)

    @property
    def word_count(self):
        return len(self.message.split())
Run Code Online (Sandbox Code Playgroud)

因此,每次插入注释时(为简单起见,我们都要说注释永远不会被编辑或删除),我们希望更新word_count相关Thread对象的属性.所以我想做点什么

def after_insert(mapper, connection, target):
    thread = target.thread
    thread.word_count = sum(c.word_count for c in thread.comments)
    print "updated cached word count to", thread.word_count

event.listen(Comment, "after_insert", after_insert)
Run Code Online (Sandbox Code Playgroud)

因此,当我插入a时Comment,我可以看到事件触发并看到它已正确计算字数,但该更改未保存到Thread …

python sqlalchemy denormalization

10
推荐指数
2
解决办法
8177
查看次数