利发国际

利发国际

文章列表
2017年最新注册送彩金

5个 C# 和 Java 之间的不同方法

     英文原文:  C#和 Java 之间最大的区别之一,是如何处理的方法。在这两种语言,方法是功能代码的基石:他们定义变量,并指定对这些变量进行操作,返回值给其他方法使用。尽管 Java 语言的创建者遵循了许多基于C语言的概念,他们研发的方法允许更少的限制和增加更多的灵活性。  C#:方法默认是非虚方法  Java:方法默认是虚方法  虚方法允许任何类继承,并重写其方法。在 Java 中,所有方法默认是虚方法。此默认设置防止插入的一个与继承类同名的不相关的方法。  在C#中,开发人员必须明确指定带“virtual”关键字的虚方法:   继承类要使用虚方法,该方法必须加上“override”关键字:  C#:支持 generator 方法  Java:不支持 generator 方法    generator 方法允许开发人员控制如何循环处理每一次迭代。而不是创建一个组,generator 方法返回每次迭代后的值作为循环过程的代码。Java 没有内置处理 generator 方法的功能,假设在 Java 中有这些功能代码,往往也是庞大而复杂的。C#使用“IEnumerable”接口创建 generator 函数和“yield”命令返回值:  C#:支持并限制分部方法  Java:不支持分部方法  Java 不支持分部方法。在 C# 中,分部方法是允许的,但必须符合特定的限制:     C#:支持扩展方法  Java:不支持扩展方法  扩展方法允许开发人员包括他们当前类型的方法,而不需要创建一个新类型或者修改现有的类型。当前的 Java 语言不支持扩展方法,但是其特性会考虑放在将来的版本中。  C#:支持条件编译  Java:有限的支持条件编译  C#编译器允许条件编译:开发者可以输入参数来确定项目编译哪些方法来使用。Java 也允许条件编译,但这种做法通常是在调试过程中使用。

  美国法官周一驳回了三星解除旗下 Galaxy Tab 10.1 平板电脑美国禁售令的请求,这是三星一周内遭遇的第三起司法挫败,该韩国制造商本月晚些时候将孤注一掷迎接与苹果的专利审判。  ,该三星平板电脑运行 Andriod 系统,与苹果 iPad 直接竞争。  “对于法院否决我们动议的决定,三星感到失望。我们认为今天的裁定最终将降低提供给美国消费者的优秀技术功能数量。”三星在声明中称。  苹果发言人重申了此前的评论,认为三星的最新产品看起来非常像 iPhone 和 iPad。“这种公然的抄袭是错误的,就像我们之前多次说的那样,当其他公司窃取我们的理念时,我们需要保护苹果知识产权。”  。  苹果和三星目前在全球 10 个国家掀起专利战,互相指控对方专利侵权,目的是争夺快速增长的移动设备市场霸权。科赫上周五还发布审判前禁令,禁止三星 Galaxy Nexus 手机在美国销售。  苹果去年对三星提起诉讼,指责后者产品“奴隶般”抄袭了苹果 iPhone 和 iPad 设计。三星对此予以否认,并提起反诉。该案件将在 7 月 30 日审判,并将对其它国家的诉讼裁定产生影响。

  狂飙突进 13 年后,作为中国最大互联网公司的腾讯已从 4000 人膨胀到了 2 万人,业务线庞大到内部人也很难弄清的地步,对 QQ 的依赖与由此产生的内耗,深重地拖累了企鹅的步伐。  被称为“行业公敌”的腾讯,在业内几乎所向披靡,如今却遭遇一个最为强劲的敌人,那就是:自己。  已经拥有 2 万员工的腾讯公司,目前面临着大公司病的困扰,新的组织架构变革已在酝酿之中。  一场新的大变革,正在中国最大的互联网公司腾讯悄悄发生。  2012年 5 月初,互联网行业中广泛流传着一条消息,称腾讯总裁刘炽平要离开腾讯:“最近一段时间,腾讯在做组织架构调整,所有 BU 重新打散,无线和 SOSO 成为重灾区,广研的地位凸显,电商和视频等重资产项目将重组。马化腾希望重新调整过的腾讯杜绝内部腐败,重新找回创新的活力,而不是单纯的惟 KPI 论。”  马化腾随后在微博上回应,称刘炽平的离职纯属谣言。不过,对于将要进行的“手术”,他却没有否认。  据多位腾讯在职员工向南方周末记者透露,刘的离职是假,但腾讯将要进行的组织架构大调整却是真的。早在两个多月前,他们就听说了这一消息,只是现在还没有下正式文件。  南方周末记者从腾讯内部员工中获得的消息还包括:这几年发展较为迅猛的电商将独立成公司;而增长乏力的无线和 SOSO 则要裁员或者裁项目。  据腾讯深圳总部一位在职员工透露,腾讯将要进行的手术还不止于此,一场更大的变革将在内部展开。  “Pony 这次要整治的其实是公司的老毛病,重新找回创新的活力。”这位员工说,其实早在两年之前,Pony 就不断表示要进行战略转型升级,而今年将采取实际行动。  Pony 是马化腾的英文名,这个从未留过学的潮汕人在 1998 年创立了腾讯,此后,将其一步步打造成了中国第一、全球第三大的互联网公司。在中国,每 4 个人中,就有一个人在用他的产品——那个胖胖的、憨态可掬的企鹅。而所有能想到的互联网业务——即时通讯、门户、游戏、电子商务、视频、搜索等等,没有他不做的。他和他构建的企鹅帝国成为了行业内最具杀伤力的掠食者。  不过,这个高速成长的帝国,在狂飙突进了 13 年、体量日渐庞大之时,却遇到了“大公司病”的困扰。这场即将展开的腾讯内部新革命,能否像 2005 年那次组织变革一样,给腾讯重新注入活力?  5月 16 日,南方周末记者向腾讯公关部门求证,得到的回复是:我们没有收到相关信息。    1998年,腾讯创立的时候有五位创始人,被称为“五虎将”。除马化腾与张志东之外,另外两位是许晨晔、陈一丹,分别担任首席信息官与首席行政官。另外一位创始人曾李青现已离开腾讯,进入投资领域。  根据腾讯 2011 年年报显示,马化腾持有腾讯股权 10.37%,张志东持有3.63%,刘炽平持有0.56%。  在中国互联网的第一波创业潮中,即时通讯的商业价值并没有被充分认识,甚至包括马化腾本人也没有完全认识到。QQ 曾经差点被卖掉,却找不到人接手。  到 2003 年年底,QQ 的注册用户已经超过两亿名,几乎垄断了国内的即时通讯市场。一年后,腾讯在香港创业板上市,以每股3.70港元的价格发售了4.202亿股,募集资金达 15.5 亿港元。  依靠数以亿计的忠实用户,腾讯将自己的触角迅速伸向了互联网世界的各个角落——门户、网络游戏、无线增值、邮件、博客、电子商务等等。  马化腾提出,腾讯要成为互联网的“水”与“电”,浸入网民们生活中的每一个细节。2005年,以上市为分水岭,腾讯提出了“二次创业”的概念,随后便开始了历史上第一次大规模组织架构的调整。  这是企鹅帝国第一次对自己动手术。当时腾讯已经拥有多达 30 个业务部门,随着业务的扩张,管理变成了一个大问题:决策复杂,层次很多,关系不清晰,各个部门间的合作性也不是很强,每个地方都要长远布局,却找不到合适的人才……  创业之初,腾讯的组织结构主要分四块,除马化腾外,其他四个创始人每人单独管一块——张志东管研发;曾李青管市场和运营(主要和电信运营商合作);陈一丹管行政、人力资源和内部审计;许晨晔则管对外的一些职能部门,比如信息部、公关部等。这种粗线条的划分,已经跟不上腾讯发展的脚步,公司管理层开始商讨,把公司过去几百人时的组织结构调整为与近 4000 人的公司相匹配的组织结构。  最终,腾讯被划分了 8 个系统,所有的一线业务系统被整合为 4 个 BU(业务单元)——无线业务、互联网业务、互动娱乐业务和网络媒体业务。另外两个系统分别是运营支持系统和平台研发系统。拥有电子商务等长期项目的企业发展系统和职能系统则直属于公司最高层管理机构——总经理办公室。  这次组织调整中,腾讯还首次设立了执行副总裁(EVP)的职位,由 7 人担任,每个人都负责一个具体的业务部门,而马化腾则抽身开来,留出更多精力进行公司的长远规划和产品规划方面的工作。  依靠 QQ 这款中国网络业绝无仅有的“杀手级产品”,腾讯几乎可以进入互联网上任何一个领域,并获得足够量级的稳定用户群,但另一方面,腾讯人也自觉不自觉地产生大树底下好乘凉的惰性。     在腾讯内部,对其最核心的资产——QQ 的争夺非常激烈。在内部的需求分类系统中,除了有“普通需求”,“加急需求”之外,老大需求通常都需要优先满足。  组织机构的调整为腾讯带来了新的动力,自此之后,腾讯产品四处开花,业务也开始腾飞。目前,腾讯形成了一百多项全业务线的产品,并提出“一站式在线生活平台”,进而延伸为“做互联网的水和电”。  不过,问题也随之而来。  由于产品线过长,腾讯的项目组也特别多。一般员工几乎很难弄清楚,到底有多少个项目组,每个项目组下,又有多少个项目小组。“一些项目组之间,不清楚各自的想法,会出现一些重复开发的现象。”曾就职于腾讯游戏部门的一位离职员工告诉南方周末记者。  据这位离职员工介绍,为了促进内部竞争,腾讯引入了国际通用的 KPI(绩效)考量标准。在一些直接盈利的部门,如游戏、电商等,每个人的工资都和 KPI 挂钩。部门的绩效如何,直接影响部门员工的年终奖金。  这种激励虽然促进了内部之间的竞争,但也带来了意料之外的后果。  据这位员工介绍,在她所供职的游戏部,每个项目小组会有一个 Leader(员工们习惯用英文表述领导者),每几个小组之上,又会有一个高一级的 Leader,与后一个 Leader 平级的,还有很多个 Leader。由于相互之间有竞争,这些 Leader 之间,很少就各自的创意进行交流,采取的方式通常是,各自带领下面的团队开发,“谁先做出来了,谁就是老大”。  负责一款游戏开发的一位“leader”告诉记者:“这个行业里最残酷的竞争,其实是发生在腾讯内部的,因为最强的对手通常都在这里。”  而最基层的员工,因为没有直接背负 KPI,所以,寻找好的项目小组就成了个人的首要大事。在腾讯内部,这被形象地称为“抱大腿”。  据这位员工透露,各项目组之间开发的游戏并不同,“有的一看就是当年能赚钱的,而有的可能要很久才会有收益,如果你跟了那个能赚钱的项目,即便你没做什么,收入可能也比那些选错了项目的人高。”  据她透露,一些游戏,甚至都无所谓好坏,只要导入到腾讯的平台上,流量和在线数立马就不一样,“跟了这样的项目,你就算走好运了”。  腾讯 2010 年公布的数据显示,QQ 的注册账户总数近 10 亿,同时在线人数超过 1 亿,也就是说,平均每 4 个网民,就有一个正在使用 QQ。可资比较的是,盛大的网络游戏《传奇》最为成功时,同时在线人数也不过百万。  在分析人士看来,依靠这款中国网络业绝无仅有的“杀手级产品”,腾讯几乎可以进入互联网上任何一个领域,并获得足够量级的稳定用户群,这也就意味着更多的收入。  这让人们开始有意无意地把马化腾的 13 年的创业生涯总结成一个童话:用前 3 个月发明一台“永动机”(或许应该叫它“永动企鹅”),然后坐地生金。  “腾讯就像一个商场,花了几年时间,建起来,积累了足够的人气,往后往里塞什么东西都好卖。”一位前游戏部员工给记者打了个比方,同样一款网游,一般的运营商做到 20 万、30万的在线玩家人数“就要开香槟庆祝”,而在腾讯的游戏平台上,做到 50 万的在线人数“看上去还挺轻松”。  据这位员工透露,在腾讯内部,如果研发的应用没有过亿用户,都抬不起头。“因为 QQ 的活跃用户数都有近 6 亿,你连六分之一都拿不到,那还叫什么好的应用?”  巨大的平台黏性也造就了硬币的另一面:腾讯的人自觉不自觉地产生大树底下好乘凉的惰性。据另一位离职员工介绍,在腾讯内部,对其最核心的资产——QQ 的争夺非常激烈。即时通讯部每天都要处理各个部门发来的各种各样的需求。  由于这些需求太多,即时通讯部不得不进行排期,列出优先级别,除了有“普通需求”,“加急需求”之外,老大需求通常都需要优先满足。  “这其实是对营销资源的一种恶性透支。”这位员工评论道,“第一次,第二次,用户可能会打开看,但到第三、第四次,可能就会烦了。这就会影响客户的体验,进而影响 QQ 的品牌形象。”  事实上,对于这一点,腾讯高层也有所察觉。马化腾就曾在一次接受媒体采访时坦承:“(部分业务)是靠腾讯的品牌影响力去撑起来的,并不完全是自己的本事。”  对于内部的这种恶性竞争,他也曾想办法解决。为了解基层动态,在 2005 年的架构调整之后,居于最高层的总经理办专门设立了不定期的总办接待日,由 HR 在各个部门随机抽取十几名员工,与马化腾或是张志东、陈一丹等公司高层共进午餐,一起探讨腾讯面临的问题。  据两位曾被抽中的腾讯员工介绍,午餐菜式并不豪华,吃饭的地方通常是在公司附近某个餐厅的包间,气氛看起来很轻松,但相互之间并不熟悉的员工实际上都很拘束。  “在那种场合,谁会提真正尖锐的问题呢?”其中的一位员工告诉记者,当得知他被抽中吃饭时,他的领导非常紧张,生怕他说什么坏话,“如果我真的讲了他什么坏话,还不被穿小鞋啊”。    腾讯在过去员工流动性并不高,但近年来新员工流失率不断加大。记者采访的多位离职员工透露,他们抱怨得最多的是“看不到未来”。这些更加强调个性与自我的 80、90后员工,是腾讯面对的新挑战。  腾讯日益扩充的产品线,对人才的需求也非常急迫。2004年,腾讯上市时,员工数不过两千多人,此后便以每年四位数的速度扩招。上市至今的 8 年时间,员工数已经翻了 10 倍,达到了两万多人。  在互联网企业中,能与其相比的只有淘宝,25000人。  一位刚在腾讯实习了三个月的应届生说,他初到举世闻名的企鹅大厦,第一印象便是人多,“总部的楼都快装不下了,周围的几栋楼也都是腾讯员工”。  2009年,为了容纳新的员工,这栋建筑面积达8.8万平方米的大厦开始启用。从深圳大学地铁站出来,便可远远看见其雄姿。大厦位于深南大道北侧,和南侧的深圳大学遥相呼应。楼体总高 193 米,地上 39 层,地下 3 层,有高管专用电梯。马化腾的办公室就在最顶层,从这里的窗口望出去,马化腾日常居住的香港就在眼皮底下。  几乎在同一时间,成都腾讯大厦和上海腾讯大厦也投入使用。腾讯公司的宣传稿上显示,加上早在 2005 年购置的北京腾讯公司楼层,目前腾讯公司的布局“已经形成南北中轴、东西两翼的分布态势”。  2005年最后一天,也就是腾讯第一次调整架构之后,腾讯网更换了 Logo,以绿、黄、红三色轨迹线环绕的小企鹅标识替代了过去的 QQ 企鹅图案。马化腾说,新 Llogo 能更好地体现腾讯网的品牌内涵和经营理念——像水和电一样真正融入亿万用户的生活。现在,这个标志就挂在大厦的最顶端。  而在大厦内部,QQ 的形象随处可见。员工的办公室里有 QQ 公仔,背景墙上有 QQ,温馨提示有 QQ,就连男女厕所都是用“Q哥”和“Q妹”来识别。  业界将腾讯奉为年轻人的乐园,看起来的确如此。2006年,公司员工的平均年龄是 27 岁。在貌似太空舱的电梯间内,年轻人们进进出出,几部液晶屏滚动播放着公司的慈善晚会、团队激励计划以及各种球类运动召集等,创新和活力似乎无处不在。  在未加入公司之前,新员工们都对腾讯充满美好的想象:大平台,名企,轻松的氛围,超出同行的待遇,以及一流的工作环境等。但一进入工作,落差顿生。  腾讯漫长的产品线要求年轻人们变成各个环节的螺丝钉,在这个中国最大的互联网企业内,最多的职位便是“产品经理”。这个岗位号称无任何专业限制,因而受到大量应届生的追捧。实际上,腾讯最为核心的文化,也在于此。它的创始人就一直以“产品经理”自居,即便在今天,这个企业的所有员工,还是亲切地将马化腾称为“首席产品体验官”。据说,他的业余时间,除了上网,就是试用腾讯的各种产品,甚至会直接将某个产品的研发人员叫到办公室,当面提意见。  不过,体验产品是一回事,开发产品却是另一回事。天涯论坛里,一位在腾讯实习了大半年,差点拿到其 Offer 的应届毕业生吐槽道:人人都说 QQ 有海量用户,没错,但是,作为产品经理,你所从事的产品是不是海量用户?QQ 美食有多少用户量?若你做的产品,不是公司战略级产品,比如 QQ 手机管家、电脑管家等,很可能就只是“3C”产品:Copy、Copy、Copy 。  他还举了他一个同学的例子:在腾讯最当红的微信团队中实习,“作为团队的一员,很牛逼吧?但他实习三个月就只干了一件事:每天不停地刷微博,看反馈”。  而这本来就是腾讯所遵循的信条之一:把用户的需求放在第一位,时刻听取他们的意见,并随时做出改变。“问题是,如果让一个年轻人每天干这种事,有什么意义呢?”这位同学反问道。这些更加强调个性与自我的 80、90后员工,制造了腾讯的新麻烦。  一些不甘于只做螺丝钉的年轻人便选择了离职。腾讯在过去员工流动性并不高,但近年来新员工流失率不断加大。虽然有诸如房价高生存压力大之类的现实压力,但南方周末记者采访的多位离职员工透露,他们抱怨得最多的是“看不到未来”。  数据来源:豆丁网     和任何一家由小到大的公司一样,腾讯也面临着既得利益者的阻挠。在腾讯内部,流传着华为帮、香港帮和本土帮之说,分指腾讯人员结构在不同阶段的变化,以及由此形成的利益团体。据一位 2011 年离职的即时通讯部员工介绍,腾讯内部曾以“关系简单化”为荣,员工也享受过由此带来的快乐工作的乐趣,但随着公司壮大,一些权力之争便开始出现,公司比以前复杂多了。“甚至比国企更复杂。”他补充道。  自 2004 年上市之后,腾讯便诞生了一批有着股票或者是期权的老员工。上市之初,腾讯的发行价不过3.7港元,而现在则涨到了 220 多港元,翻了近 60 倍。据这位员工透露,马化腾曾在内部大会上多次提及,要警惕公司的“富二代”,“躺在功劳簿上等退休,毫无创新之气”。  一些基层员工对此有着最直接的感受。新人之间流传这一种说法,你能做多大的事,有时不是取决于你自己,而是取决于你跟了哪个 Leader——如果 Leader 想做事,你也就能做事,如果 Leader 只想混日子,你也便只好混日子。  据腾讯游戏部的一位离职员工介绍,按照腾讯的规则,只要你有创意,也可以自己组建研发团队,一些项目组长为了做大,通常会想出各种点子,尽量地扩建团队,将自己这份蛋糕做大。在这一过程中,一些不好的现象也随之出现,“其中最典型的,就是讨好上级”。  她给记者举了个例子,有一次,一位更高层级的领导在内部交流群中就他们小组开发的游戏中的某个细节随口提了个建议,她的一位同事竟然用 Word 文档复制下来,传给小组成员:“领导喜欢这个,我们就按照这个来改。”  而据即时通讯部的另一位离职员工透露,一些不同部门的项目小组之间,竟然会出现相互抄袭,“看到你这里有个好创意,直接拿来,改一改外观或者是功能,也能用在另一个产品上”。  而腾讯视频部的另一位离职员工则告诉记者,他对腾讯的失望,不只是创新精神的丧失,而是言路的闭塞,“从我到马化腾,有 12 个层级,你说,我的声音如何能到得了他那里?”  这位员工告诉记者,在职期间,他曾向自己的领导提过多次意见,但都如石沉大海,最后,他选择了辞职创业,“走出腾讯大厦的那一刻,我突然觉得豁然开朗,压抑之情一扫而光”,两年之后,已经是一家小公司老板的这位员工对记者说。  不过,让人意外的是,这些离职员工大多对腾讯依然有着高度的认同感,他们一面抱怨腾讯的种种问题,另一方面,却在极力维护它的利益。他们都不停地向记者强调一个问题:Pony(马化腾)没有问题,问题出在中层管理上。  这种认同,不仅局限于腾讯内部,即便在腾讯的对手中,也存在这种说法。在移动互联网时代,腾讯推出的微信盛极一时,有记者问雷军,米聊为何输给了微信,雷军列了四点,其中最后一点是“马化腾成功后,没玩飞机游艇,还能盯到一线,是中国企业家的楷模”。  即便如此,腾讯内部的危机如何化解仍是个悬念,这不仅仅是高层与员工一起午餐所能解决的。  据腾讯一位在职员工透露,几个月前,腾讯还专门组织高管去思科总部学习经验,推进腾讯内部的组织架构 SNS 化。这种源于 2001 年互联网泡沫破裂时的体系,其核心是建立跨部门决策团队,下放决策权。据了解,目前,腾讯已经在 SNS 等重合较多的业务方向设立了跨部门决策团队。  而在最近两个月中,内部组织架构大调整的风声已从高层通过各级 Leader 传递到腾讯员工中,腾讯内部正在酝酿着一场新革命。

  WiFi Alliance 希望 WiFi 设备能,能自动验证和切换。  WiFi Alliance 称,它的 Passpoint 计划目标是让 WiFi 变成网络服务商网络的真正扩展,能从一个热点漫游到另一个热点,无需手动干扰,就像手机用户从一个手机塔无缝漫游到另一个手机塔。Passpoint 认证网络设备和终端用户设备预计将从下个月开始推出,将基于 Hotspot 2.0 规格。手机的 SIM 卡可能被用于验证访问无线热点的移动用户,但 Passpoint 服务的价格目前尚不清楚。

  全文译自墙外文章“”,译得不好,还请见谅。这篇文章看完之后,你可能会对 NoSQL 的数据结构会有些感觉。我的感觉是,关系型数据库想把一致性,完整性,索引,CRUD 都干好,NoSQL 只干某一种事,但是牺牲了很多别的东西。总体来说,我觉得 NoSQL 更适合做 Cache。下面是正文——  NoSQL 数据库经常被用作很多非功能性的地方,如,扩展性,性能和一致性的地方。这些 NoSQL 的特性在理论和实践中都正在被大众广泛地研究着,研究的热点正是那些和性能分布式相关的非功能性的东西,我们都知道 被很好地应用于了 NoSQL 系统中(陈皓注:CAP 即,一致性(Consistency), 可用性(Availability), 分区容忍性(Partition tolerance),在分布式系统中,这三个要素最多只能同时实现两个,而 NoSQL 一般放弃的是一致性)。但在另一方面,NoSQL 的数据建模技术却因为缺乏像关系型数据库那样的基础理论没有被世人很好地研究。这篇文章从数据建模方面对 NoSQL 家族进行了比较,并讨论几个常见的数据建模技术。  要开始讨论数据建模技术,我们不得不或多或少地先系统地看一下 NoSQL 数据模型的成长的趋势,以此我们可以了解一些他们内在的联系。下图是 NoSQL 家族的进化图,我们可以看到这样的进化:Key-Value 时代,BigTable 时代,Document 时代,全文搜索时代,和 Graph 数据库时代:(陈皓注:注意图中 SQL 说的那句话,NoSQL 再这样发展下去就是 SQL 了,哈哈。)    NoSQL Data Models  首先,我们需要注意的是 SQL 和关系型数据模型已存在了很长的时间,这种面向用户的自然性意味着:  另一方面,SQL 可以让软件应用程序在很多情况下不需要关心数据库的数据聚合,和数据完整性和有效性进行控制。而如果我们去除了数据一致性,完整性这些东西,会对性能和分布存储有着重的帮助。正因为如此,我们才有数据模型的进化:    本文剩下的章节将向你介绍数据建模的技术实现和相关模式。但是,在介绍这些技术之前,先来一段序言:  下面是 NoSQL 的分类表,也是我用来写这篇文章时做实践的产品:    这一节主要介绍 NoSQL 数据模型的基本原则。    反规格化 Denormalization 可以被认为是把相同的数据拷贝到不同的文档或是表中,这样就可以简化和优化查询,或是正好适合用户的某中特别的数据模型。这篇文章中所说的绝大多数技术都或多或少地导向了这一技术。  总体来说,反规格化需要权衡下面这些东西:  : Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库。    所有类型的 NoSQL 数据库都会提供灵活的 Schema(数据结构,对数据格式的限制):  灵活的 Schema 允许你可以用一种嵌套式的内部数据方式来存储一组有关联的业务实体(陈皓注:类似于 JSON 这样的数据封装格式)。这样可以为我们带来两个好处。  下图示意了这两种好处。图中描给了电子商务中的商品模型(陈皓注:我记得我在“”一文中说到过电商中产品分类数据库设计的挑战)  对于关系型数据库来说,要设计这样的数据模型并不简单,而且设计出来的绝对离优雅很远很远。而我们 NoSQL 中灵活的 Schema 允许你使用一个聚合 Aggregate (product) 可以建出所有不同种类的商品和他们的不同的属性:  Entity Aggregation  上图中我们可以比较关系型数据库和 NoSQL 的差别。。  : Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库。    表联结基本上不被 NoSQL 支持。正如我们前面所说的,NoSQL 是“面向问题”而不是“面向答案”的,不支持表联结就是“面向问题”的后果。表的联结是在设计时被构造出来的,而不是在执行时建造出来的。所以,表联结在运行时是有很大开销的(陈皓注:搞过 SQL 表联结的都知道笛卡尔积是什么东西,大可以在参看以前酷壳的“”),但是在使用了 Denormalization 和 Aggregates 技术后,我们基本不用进行表联结,如:你们使用嵌套式的数据实体。当然,如果你需要联结数据,你需要在应用层完成这个事。下面是几个主要的 Use Case:  : Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库, Graph Databases 图数据库。    在本书中,我们将讨论 NoSQL 中各种不同的通用的数据建模技术。    很多 NoSQL 的数据库(并不是所有)在事务处理上都是短板。在某些情况下,他们可以通过分布式锁技术或是来实现其事务性(陈皓注:可参看本站的“多版本并发控制(MVCC)在分布式系统中的应用”)但是,通常来说只能使用聚合 Aggregates 技术来保证一些 ACID 原则。  这就是为什么我们的关系型数据库需要有强大的事务处理机制——因为关系型数据库的数据是被规格化存放在了不同的地方。所以,Aggregates 聚合允许我们把一个业务实体存成一个文档、存成一行,存成一个 key-value,这样就可以原子式的更新了:  Atomic Aggregates  当然,原子聚合 Atomic Aggregates 这种数据模型并不能实现完全意义上的事务处理,但是如果支持原子性,锁,或 test-and-set 指令,那么, Atomic Aggregates 是可以适用的。  Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库。    也许,对于无顺序的 Key-Value 最大的好处是业务实体可以被容易地 hash 以分区在多个服务器上。而排序了的 key 会把事情搞复杂,但是有些时候,一个应用能从排序 key 中获得很多好处,就算是数据库本身不提供这个功能。让我们来思考下 email 消息的数据模型:  Key-Value Store 键值对数据库    Dimensionality Reduction 降维是一种技术可以允许把一个多维的数据映射成一个 Key-Value 或是其它非多给的数据模型。  传统的地理位置信息系统使用一些如“四分树 ” 或 “” 来做地理位置索引。这些数据结构的内容需要被在适当的位置更新,并且,如果数据量很大的话,操作成本会很高。另一个方法是我们可以遍历一个二维的数据结构并把其扁平化成一个列表。一个众所周知的例子是 (地理哈希)。一个 Geohash 使用“之字形”的路线扫描一个 2 维的空间,而且遍历中的移动可以被简单地用 0 和 1 来表示其方向,然后在移动的过程中产生0/1串。下图展示了这一算法:(陈皓注:先把地图分成四份,经度为第一位,纬度为第二位,于是左边的经度是0,右边的是1,纬度也一样,上面是为1,下面的为0,这样,经纬度就可以组合成 01,11,00,10这四个值,其标识了四块区域,我们可以如此不断的递归地对每个区域进行四分,然后可以得到一串 1 和 0 组成的字串,然后使用0-9,b-z 去掉(去掉a, i, l, o)这 32 个字母进行 base32 编码得到一个 8 个长度的编码,这就是 Geohash 的算法)  Geohash Index  Geohash 的最强大的功能是使用简单的位操作就可以知道两个区域间的距离,就像图中所示(陈皓:proximity 框着的那两个,这个很像 IP 地址了)。Geohash 把一个二维的坐标生生地变成了一个一维的数据模型,这就是降维技术。BigTable 的降维技术参看到文章后面的 [6.1]。更多的关于 Geohash 和其它技术可以参看 [6.2] 和 [6.3]。   Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库。    Index Table 索引表是一个非常直白的技术,其可以你在不支持索引的数据库中得到索引的好处。BigTable 是这类最重要的数据库。这需要我们维护一个有相应存取模式的特别表。例如,我们有一个主表存着用户帐号,其可以被 UserID 存取。某查询需要查出某个城市里所有的用户,于是我们可以加入一张表,这张表用城市做主键,所有和这个城市相关的 UserID 是其 Value,如下所示:  Index Table Example  可见,城市索引表的需要和对主表用户表保持一致性,因此,主表的每一个更新可能需要对索引表进行更新,不然就是一个批处理更新。无论哪个方式,这都会损伤一些性能,因为需要保持一致性。  Index Table 索引表可以被认为是关系型数据库中的视图的等价物。  : BigTable 数据库。    Composite key 键组合是一个很常用的技术,对此,当我们的数据库支持键排序时能得到极大的好处。Composite key 组合键的拼接成为第二排序字段可以让你构建出一种多维索引,这很像我们之前说过的 Dimensionality Reduction 降维技术。例如,我们需要存取用户统计。如果我们需要根据不同的地区来统计用户的分布情况,我们可以把 Key 设计成这样的格式 ,这样一来,就使得我们可以通过 State 到 City 来按组遍历用户,特别是我们的 NoSQL 数据库支持在 key 上按区查询(如:BigTable 类的系统):  Composite Key Index  BigTable 数据库。    Composite keys  键组合技术并不仅仅可以用来做索引,同样可以用来区分不用的类型的数据以支持数据分组。考虑一个例子,我们有一个海量的日志数组,这个日志记录了互联网上的用户的访问来源。我们需要计算从某一网站过来的独立访客的数量,在关系型数据库中,我们可能需要下面这样的 SQL 查询语句:  我们可以在 NoSQL 中建立如下的数据模型:  Counting Unique Users using Composite Keys  这样,我们就可以把数据按 UserID 来排序,我们就可以很容易把同一个用户的数据(一个用户并不会产生太多的 event)进行处理,去掉那些重复的站点(使用 hash table 或是别的什么)。另一个可选的技术是,我们可以对每一个用户建立一个数据实体,然后把其站点来源追加到这个数据实体中,当然,这样一来,数据的更新在性能相比之下会有一定损失。   Ordered Key-Value Store 排序键值对数据库, BigTable 风格的数据库。    这个技术更多的是数据处理技术,而不是数据建模技术。尽管如此,这个技术还是会影响数据模型。这个技术最主要的想法是使用一个索引来找到满足某条件的数据,但是把数据聚合起需要使用全文搜索。还是让我们来说一个示例。还是用上面那个例子,我们有很多的日志,其中包括互联网用户和他们的访问来源。让我们假定每条记录都有一个 UserID,还有用户的种类 (Men, Women, Bloggers, 等),以及用户所在的城市,和访问过的站点。我们要干的事是,为每个用户种类找到满足某些条件(访问源,所在城市,等)的的独立用户。  很明显,我们需要搜索那些满足条件的用户,如果我们使用反转搜索,这会让我们把这事干得很容易,如:  或 。使用这样的索引, 我们可以取两个或多个 UserID 要的交集或并集(这个事很容易干,而且可以干得很快,如果这些 UserID 是排好序的)。但是,我们要按用户种类来生成报表会变得有点麻烦,因为我们用语句可能会像下面这样  但这样的 SQL 很没有效率,因为 category 数据太多了。为了应对这个问题,我们可以建立一个直接索引  然后我们用它来生成报表:  Counting Unique Users using Inverse and Direct Indexes  最后,我们需要明白,对每个 UserID 的随机查询是很没有效率的。我们可以通过批查询处理来解决这个问题。这意味着,对于一些用户集,我们可以进行预处理(不同的查询条件)。  : Key-Value Store 键值对数据库, Document Databases 文档数据库, BigTable 风格的数据库。      树形或是任意的图(需反规格化)可以被直接打成一条记录或文档存放。  Tree Aggregation  : Key-Value 键值对数据库, Document Databases 文档数据库    Adjacency Lists 邻接列表是一种图 – 每一个结点都是一个独立的记录,其包含了所有的父结点或子结点。这样,我们就可以通过给定的父或子结点来进行搜索。当然,我们需要通过 hop 查询遍历图。这个技术在广度和深度查询,以及得到某个结点的子树上没有效率。  : Key-Value 键值对数据库, Document Databases 文档数据库    Materialized Paths 可以帮助避免递归遍历(如:树形结构)。这个技术也可以被认为是反规格化的一种变种。其想法是为每个结点加上父结点或子结点的标识属性,这样就可以不需要遍历就知道所有的后裔结点和祖先结点了:    Materialized Paths for eShop Category Hierarchy  这个技术对于全文搜索引擎来说非常有帮助,因为其可以允许把一个层级结构转成一个文档。上面的示图中我们可以看到所有的商品或下的子分类可以被一条很短的查询语句处理——只需要给定个分类名。  Materialized Paths 可以存储一个 ID 的集合,或是一堆 ID 拼出的字符串。后者允许你通过一个正则表达式来搜索一个特定的分支路径。下图展示了这个技术(分支的路径包括了结点本身):    Query Materialized Paths using RegExp  : Key-Value 键值对数据库, Document Databases 文档数据, Search Engines 搜索引擎     嵌套集是树形结构的标准技术。它被广泛地用在了关系性数据库中,它完全地适用于 Key-Value 键值对数据库和 Document Databases 文档数据库。这个技术的想法是把叶子结点存储成一个数组,并通过使用索引的开始和结束来映射每一个非叶子结点到一个叶子结点集,就如下图所示一样:  Modeling of eCommerce Catalog using Nested Sets  这样的数据结构对于 immutable data 不变的数据有非常不错的效率,因为其点内存空间小,并且可以很快地找出所有的叶子结点而不需要树的遍历。尽管如此,在插入和更新上需要很高的性能成本,因为新的叶子结点需要大规模地更新索引。  : Key-Value Stores 键值数据库, Document Databases 文档数据库    搜索引擎基本上来说和扁平文档一同工作,如:每一个文档是一个扁平的字段和值的例表。这种数据模型的用来把业务实体映射到一个文本文档上,如果你的业务实体有很复杂的内部结构,这可能会变得很有挑战。一个典型的挑战是把一个有层级的文档映映射出来。例如,文档中嵌套另一个文档。让我们看看下面的示例:  Nested Documents Problem  上面的每一个业务实体代码一种简历。其包括了人名和一个技能列表。我把这个层级文档映射成一个文本文档,一种方法是创建  和  字段。这个模型可以通过技术或是等级来搜索一个人,而上图标注的那样的组合查询则会失败。(陈皓注:因为分不清 Excellent 是否是 Math 还是 Poetry 上的)  在引用中的 [4.6] 给出了一种解决方案。其为每个字段都标上数字  和 ,这样就可以分开搜索每一个对(下图中使用了 OR 来遍历查找所有可能的字段):    Nested Document Modeling using Numbered Field Names  这样的方式根本没有扩展性,对于一些复杂的问题来说只会让代码复杂度和维护工作变大。  : Search Engines 全文搜索    在附录 [4.6]中给出了这个技术用来解决扁平层次文档。它用邻近的查询来限制可被查询的单词的范围。下图中,所有的技能和等级被放在一个字段中,叫 SkillAndLevel,查询中出现的 “Excellent” 和 “Poetry” 必需一个紧跟另一个:    Nested Document Modeling using Proximity Queries  附录 [4.3] 中讲述了这个技术被用在 Solr 中的一个成功案例。  : Search Engines 全文搜索    Graph databases 图数据库,如 neo4j 是一个出众的图数据库,尤其是使用一个结点来探索邻居结点,或是探索两个或少量结点前的关系。但是处理大量的图数据是很没有效率的,因为图数据库的性能和扩展性并不是其目的。分布式的图数据处理可以被 MapReduce 和 Message Passing pattern 来处理。如: 。这个方法可以让 Key-Value stores, Document databases, 和 BigTable-style databases 适合于处理大图。  : Key-Value Stores, Document Databases, BigTable-style Databases    Finally, I provide a list of useful links related to NoSQL data modeling:

分类(利发国际)| 2016-01-14 10:03:06