精华内容
下载资源
问答
  • 文章来源: ... 数据库分区的优势: 性能的提升(Increased performance) 在扫描操作,如果MySQL的优化器知道哪个分区才包含特定查询

    文章来源:

    http://baike.baidu.com/link?url=M_wdTsWIjv2gQisL3UKNG2nFWlvN55_PGPCzGjdF7eTS_71vvJNvJ0cjACTBCi11dwOqNn7E2UfTPkVEugyv-q

    数据库分区的优势:

    性能的提升(Increased performance)

    在扫描操作中,如果MySQL的优化器知道哪个分区中才包含特定查询中需要的数据,它就能直接去扫描那些分区的数据,而不用浪费很多时间扫描不需要的地方了。需要举个例子?好啊,百万行的表划分为10个分区,每个分区就包含十万行数据,那么查询分区需要的时间仅仅是全表扫描的十分之一了,很明显的对比。同时对十万行的表建立索引的速度也会比百万行的快得多得多。如果你能把这些分区建立在不同的磁盘上,这时候的I/O读写速度就“不堪设想”(没用错词,真的太快了,理论上100倍的速度提升啊,这是多么快的响应速度啊,所以有点不堪设想了)了。

    对数据管理的简化

    分区技术可以让DBA对数据的管理能力提升。通过优良的分区,DBA可以简化特定数据操作的执行方式。例如:DBA在对某些分区的内容进行删除的同时能保证余下的分区的数据完整性(这是跟对表的数据删除这种大动作做比较的)。
    此外分区是由MySQL系统直接管理的,DBA不需要手工的去划分和维护。例如:这个例如没意思,不讲了,如果你是DBA,只要你划分了分区,以后你就不用管了就是了。
     
     
    实例:
    问:sql server 2005数据库  数据表数据量太多导致服务速度慢  应该怎么样优化 如果建立表分区 应该怎样建立
    答:对SQL Server数据表进行分区的过程分为三个步骤:
    
      1)建立分区函数
    
      2)建立分区方案
    
      3)对表格进行分区
    
      第一个步骤:建立分区函数
    
      分区函数定义[u]how[/u],即你想要SQL Server如何对数据进行分区。这里就不以某一个表格作为例子,而是总体概括分割数据的技术。
    
      分区是通过指定每个分区的分割界线实现的。例如,假定我们有一个Customers表格,里面包含了企业所有的客户的信息,客户信息以唯一的客户号进行辨识,客户号从1到1000000。我们可以运用以下的分区函数(这里称之为customer_Partfunc)把这个表格平均分为四个分区:
    
      CREATE PARTITION FUNCTION customer_partfunc (int) 
      AS RANGE RIGHT 
      FOR VALUES (250000, 500000, 750000) 
    
      这些分割界线指定了四个分区。第一个分区包含所有值小于250000的记录。第二个分区包含所有值在250000和499999之间的记录。而第三个分区包含所有值在500000和749999之间的记录。其他所有大于或等于750000的记录都包含在第四个分区里。
    
      注意这个例子中使用了“RANGE RIGHT”从句。这说明分界值是在分区的右边。同样,如果使用的是“RANGE LEFT”从句,那么第一个分区就会包含所有值小于或等于250000的记录;第二个分区就会包含所有值在250001和500000之间的记录,如此类推。
    
      第二个步骤:建立分区方案
    
      一旦建立完定义如何对数据进行分区的分区函数之后,下一步就是建立一个分区方案,定义[u]where[/u],即你想在哪里对数据进行分区。这是一个很直接明了的过程,例如,如果我有四个文件组,名称分别从“fg1”到“fg4”,那么就可以使用以下分区方案:
    
      CREATE PARTITION SCHEME customer_partscheme 
      AS PARTITION customer_partfunc 
      TO (fg1, fg2, fg3, fg4) 
    
      注意我们现在把一个分区函数连接到了分区方案,但是我们还没有把分区方案连接到任何具体的数据库表格。这就是重复使用功能发挥功能的时候。我们可以通过这个功能把分区方案(或者只是分区函数)用于数据库表格的任何数据上。
    
      第三个步骤:对表格进行分区
    
      建立好分区方案之后,就可以开始对表格进行分区了。这是最简单的一个步骤,只需要在表格创建语句中添加“ON”从句,指定表格分区方案和要应用该分区方案的表列。你不需要指定分区函数,因为分区方案已经定义了分区函数。
    
      举个例子,假设你想要用上述的分区方案来创建一个客户表格,你需要使用以下Transact-SQL语句:
    
      CREATE TABLE customers (FirstName nvarchar(40), LastName nvarchar(40), CustomerNumber int) 
      ON customer_partscheme (CustomerNumber)
    展开全文
  • 在本系列的前两篇文章(“ 使用RDF创建数据网 ”和“ 使用SPARQL查询RDF数据 ”),您了解了资源描述框架(RDF)以及SPARQL协议和RDF... 现在,您知道如何通过HTTP将RDF数据提取给您以进行本地查询,或将查询推送...

    关联数据库中多张表

    在本系列的前两篇文章(“ 使用RDF创建数据网 ”和“ 使用SPARQL查询RDF数据 ”)中,您了解了资源描述框架(RDF)以及SPARQL协议和RDF查询语言(SPARQL)—两个万维网联盟(W3C)标准,用于创建可移植的,可查询的,网络友好的数据。 通过RDF的图形模型,可以轻松地从各种来源收集有关主题的信息。 现在,您知道如何通过HTTP将RDF数据提取给您以进行本地查询,或将查询推送到符合标准的服务器,以避免传输不相关的数据。 在此大规模数据集成文章中 ,您将学习RDF和SPARQL如何与Web的体系结构相结合来创建和使用Linked Data

    关联数据原则

    为了鼓励在网络上发布数据的方式的一致性,Tim Berners-Lee定义了链接数据的四个原则

    1. 使用统一资源标识符(URI)作为事物的名称。
    2. 使用HTTP URI,以便人们可以查找这些名称。
    3. 当某人查找URI时,请使用标准(RDF *,SPARQL)提供有用的信息。
    4. 包括指向其他​​URI的链接,以便他们可以发现更多内容。

    这些原则背后的动机在本系列文章中不需要太多解释,但是为了清楚起见,我将快速进行介绍。

    首先,命名方案的目的是在共享上下文中进行引用。 这些引用应一致,明确且无冲突。 URI标准提供了一种命名方案:一种用于创建命名方案的方案。 只要您知道如何在系统中解析,表示和潜在地存储URI,就可以接受任何其他遵守该标准的系统的标识符。 这样的系统可以包括今天编写和部署的代码,将来可以接受对新的,符合URI的名称的名称引用。

    存在其他全局命名系统。 常见的方案是国际标准书号 (ISBN)。 多年来,ISBN对于标准化书籍参考至关重要。 该计划的成功主要是由于对命名系统的支持减少了书籍出版和发行市场的成本和错误。 不幸的是,ISBN号仅指书籍。 杂志,乐谱和视听产品(电影,电视节目,广播体育赛事)都有单独的标识符方案。 可以使用诸如Dewey十进制分类系统的分层分类方案来指定书籍的主题,但这是另一个不兼容的标识符系统。 可以通过ORCID标识符识别学术研究人员,但非学术界没有此类系统可用。 因此,要表明某个特定的研究人员针对某个已知主题写了一本(学术)书,不仅涉及三个单独的标识符,还涉及三个单独的方案! 有一个标准的方案来引用所有这些东西显然很有意义。

    注意,Berners-Lee的指导并不是每个人都需要使用相同的 URI。 您只需使用URI标准即可获得基本的互操作性。 当人们确实同意如何称呼事物时,这是很好的,但并非必须如此。 RDF图中的节点和链接标识符均是如此。

    其次,即使任何支持URI的系统都可以使用对外部数据集中URI标识符的引用,但是系统的用户可能无法识别该标识符。 陌生的标识符需要一种方法来查找其指向的内容。 为了找出有关命名实体的任何信息,摄取系统必须知道这种服务或有发现它的方法。 结果,消费者应用程序必须支持使用特定命名方案的依赖关系和耦合。

    第二个原则为交换数据增加了巨大的价值。 如果您的系统可以使用URI(如果它们是可解析的URI(URL)),那么-要了解有关它们的更多信息,您可以将它们像其他任何Web资源一样对待,并向它们发出GET请求。 不需要发现单独的服务,除了HTTP及其统一接口之外,没有新的依赖项。 该名称既是标识符,也是您可以了解更多信息的句柄。

    第三个原则阐明-除了解析资源时要返回的其他任何自定义格式外,如果您允许标准数据模型的标准序列化,则解析系统不需要了解任何其他信息即可解析结果结构。 系统可能不知道标识符是什么,但是根据第二个原理,只要想了解更多信息,它就可以解析它们。 除了标准的序列化格式之外,支持标准查询机制(例如SPARQL协议)的客户端还可以使客户询问您的数据问题。

    链接数据是一种根本不同的方法,可以在生产力,规模和灵活性水平上工作,如果您拥有的一切都是与企业和编程语言相关的解决方案,那么很难想象。

    因为第一个原则不需要使用标准标识符(仅使用标准标识符方案),所以可以确保在不同数据集中对同一事物赋予多个名称。 这个问题可以通过多种方式解决,但是我不会花时间解释它的深度。 通常,可以使用Web本体语言 (OWL)中的owl:sameAs等高阶语义关系来永久地等同于标识符。 从那时起,您可以使用理解OWL语义的任何推理系统来查询任何等效资源并从所有这些资源中获取属性。 这里的重点是,这种机制为您提供了将术语与其他术语联系起来的方法。 这样做可以丰富您的数据,并有助于支持数据集之间的可发现性。

    总体而言,这些原则适用于公共和私人数据。 不要将所有这些技术都看作只是要提供的免费公共数据。 归根结底,它们都是Web资源,您可以将它们放在防火墙,收费墙以及身份验证和授权模型之后。 目的是解决使用大规模工作的技术将各种数据源之间的信息连接起来的许多问题。 与不基于网络友好标准的更昂贵,易碎且耗时的技术相比,实现该目标有助于将集成成本降低到几乎没有。

    您只需要看Linking Open Data社区项目就可以看到这些想法的大规模实施。

    链接开放数据项目

    2007年,一小群人-链接开放数据(LOD)社区项目-开始连接一系列公共数据集。 在图1中,您将看到捆绑在一起的前12个数据集-包括DBpediaGeoNames美国人口普查信息。

    图1. 2007年的Linking Open Data项目云
    2007年的链接数据项目云。

    我将在一分钟内再谈DBpedia。 现在,首先从DBpedia获得从Wikipedia中提取的有关加利福尼亚州奥本的信息。 有关Auburn的其他信息可能是在2000年美国人口普查中收集的,而某些信息可能来自GeoNames项目 这三个数据集对同一事物(Auburn)使用不同的标识符,但是在后台进行了一些摸索之后,您可以看到DBpedia使用OWL sameAs关系来连接术语。 现在,您可以使用这三个术语中的任何一个来通过基于OWL的推理器查询数据并检索所有结果。 (同样,这种方法的工作方式和原因超出了本文的范围。)

    在清单1中,Auburn的GeoNames项目中的URI等同于英语上下文中的Auburn DBpedia资源。 然后,我将Auburn的Freebase标识符连接到DBpedia资源。 最终,我将日语DBpedia语言上下文中的Auburn标识符连接到英语。 此时,所有这四个名称都彼此等同。 现在,将其中任何一个指定为主题的三元组都适用。

    清单1.用OWL连接标识符
    # Connecting the DBpedia resource for Auburn, CA to three other
    # resources using owl:sameAs
    
    @prefix owl:   <http://www.w3.org/2002/07/owl#> .
    
    <http://sws.geonames.org/5325223/>
      owl:sameAs  <http://dbpedia.org/resource/Auburn,_California> .
    <http://rdf.freebase.com/ns/m.0r2rz> 
      owl:sameAs  <http://dbpedia.org/resource/Auburn,_California> .
    <http://ja.dbpedia.org/resource/オーバーン_(カリフォルニア州)>
      owl:sameAs  <http://dbpedia.org/resource/Auburn,_California> .

    值得记住的是,这些数据集来自不同的组织,不一定由LOD项目的成员生成。 但是它们是使用标准来表示的,这使得使各种客户都可以使用数据变得很重要。 一些数据以RDF的形式本机存储在文件中,一些数据以三重存储形式存储,一些存储在关系数据库中,并根据需要作为RDF进行投影。 链接数据技术的使用通常不会增加信息源的负担。 这些技术仅仅是解放信息并将其轻松连接到相关内容的渠道。 数据集之间的链接可以与其余内容结合在一起,也可以在链接集中保持分离。

    请记住,在上一篇文章中 ,您可以通过SPARQL从多个数据源中收集信息,只需使用FROM关键字引用它们即可。 现在,您可以想象不打乱原始数据,而是将标识符链接存储在文件中,如清单1所示,并参考SPARQL查询中的链接集,如清单2所示。对于查询而言,每个数据源中的术语都将包含在图中,并可用于基于推理的集成。

    清单2.具有数据集和链接集的SPARQL查询
    SELECT variable-list
    FROM dataset1
    FROM dataset2
    FROM linkset
    WHERE {
       graph pattern
    }

    LOD项目的最初12个数据集以这种方式连接。 然后添加更多。 然后更多。 该项目增加了涉及学术研究引证的新数据集类别; 生命科学; 政府生产的数据; 有关演员,导演,电影,餐厅的信息; 和更多。 到2014年,已连接代表十亿个RDF三元组的570个数据集。 您可以在图2中看到截止到2014年的LOD云图摘要。在启用SVG的浏览器中探索交互式版本将带来更多乐趣。 如果单击大多数单独的数据集,您将被带到其相应的Datahub页面。

    图2. 2014年的LOD项目云
    2014年的链接开放数据项目云。

    其中许多数据集都使用来描述-还有什么? —用于描述互连数据的RDF词汇表:互连数据词汇表 (VoID)。 谁生产的? 他们什么时候上次修改的? 他们多大? 在哪里可以找到将它们连接到其他数据的链接集? VoID描述回答了这些问题。

    让我们更深入地研究这些数据源之一: DBpedia DBpedia是从Wikipedia提供结构化元数据的最早尝试之一。 DBpedia的VoID描述将包含清单3之类的元数据。

    清单3. DBpedia的示例VoID描述
    @prefix void: <http://rdfs.org/ns/void#> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    @prefix dcterms: <http://purl.org/dc/terms/> .
    @prefix foaf: <http://xmlns.com/foaf/0.1/> .
    @prefix wv: <http://vocab.org/waiver/terms/norms> .        
    @prefix sd: <http://www.w3.org/ns/sparql-service-description#> .
    @prefix : <#> .
    
    :DBpedia a void:Dataset;
        dcterms:title "DBPedia";
        dcterms:description "RDF data extracted from Wikipedia";
        dcterms:contributor :FU_Berlin;
        dcterms:contributor :University_Leipzig;
        dcterms:contributor :OpenLink_Software;
        dcterms:contributor :DBpedia_community;
        dcterms:source <http://dbpedia.org/resource/Wikipedia>;
    
        dcterms:modified "2008-11-17"^^xsd:date;
        .
        
    :DBpedia_Geonames a void:Linkset
        ...
        .
        
    :FU_Berlin a foaf:Organization;
        rdfs:label "Freie Universität Berlin";
        foaf:homepage <http://www.fu-berlin.de/>;
    .
    .
    .

    从描述中,您发现DBpedia是从Wikipedia中提取的信息。 尽管Wikipedia上的大多数内容都是非结构化的,但该站点包含大量受编辑控制的结构。 尤其是,文章中的信息框是一致的,并易于以结构良好的方式产生其信息。 结果,使用来自119种本地化语言上下文的25亿个RDF三元组来独特地描述了超过1,260万种事物,其中包括:

    • 830,000人
    • 640,000个地方
    • 370,000件创意作品
    • 210,000个组织
    • 226,000种
    • 5,600种疾病

    这些主题中的每一个都是具有自己可解析标识符的自身资源。 在思考此处描述的主题的范围和多样性时,请记住,此多域数据集是由志愿者维护和策划的。 它包括2500万个图像链接,2800万个文档链接和4500万个其他RDF数据集链接。 将近四分之三的资源按来自多个本体的类别进行组织。

    这些资源中的每一个都有一个逻辑标识符,一个HTML呈现的页面以及一个指向RDF / XML序列化的直接链接:

    http://dbpedia.org/resource/Auburn,_California     # logical identifier
    http://dbpedia.org/page/Auburn,_California         # HTML-rendered page
    http://dbpedia.org/data/Auburn,_California.rdf     # direct RDF link

    如果您单击指向逻辑资源的链接,则会将您重定向到HTML呈现的视图。 发生这种情况的原因是,当您单击该链接时,浏览器会请求以HTML作为其首选来源的响应。 DBpedia服务器将您重定向到呈现的表单。 从那里,您可以探索奥本与相关资源的联系,例如其报纸 ,所在和在此出生的著名人物

    这些URI都是资源参考,并且使用从Wikipedia中提取的RDF描述每个资源。 单击时看到的是RDF数据HTML呈现,而不是该资源的网页。 例如, Auburn Journal拥有自己的网页,可以通过从报纸资源中删除http://dbpedia.org/ontology/wikiPageExternalLink关系来发现该网页。

    我提到过,大多数DBpedia资源都来自多个本体。 具体而言,这意味着资源是属于RDF资源的类的实例。 如果仔细查看Auburn的资源页面,您会发现它是几个类的rdf:type ,包括:

    请注意,这些是来自不同方案的不同类。 通过断言新的rdf:type实例关系到任何有意义的地方,很容易看出可以随时添加更多类别。 但是,这是一个集合成员关系。 这意味着可以查询属于该集合(或该类的实例)成员的任何东西。 如果点击http://dbpedia.org/page/Category:Cities_in_Placer_County,_California类别,则会看到Placer County的其他城市,包括LoomisRocklinRoseville 在这里,您会看到一组相关城市,它们基于它们属于同一县的收容关系。

    http://dbpedia.org/page/Category:County_seats_in_California类包含一个更大的类。 在这里,加州各县的席位被归类在一起,通过关系,您可以从一个州到其他您知道的州。 您正在浏览的链接实际上是在后台处理的隐式SPARQL查询。 等效查询为:

    SELECT ?s WHERE {
     ?s a <http://dbpedia.org/class/yago/CountySeatsInCalifornia>
    }

    因为DBpedia支持我在上一篇文章中介绍的SPARQL协议 ,所以该查询可以变成直接链接 扩展形式为:

    http://dbpedia.org/snorql/?query=SELECT+%3Fs+WHERE+%7B%0D%0A+%3Fs+a+%3Chttp%3A \
    %2F%2Fdbpedia.org%2Fclass%2Fyago%2FCountySeatsInCalifornia%3E%0D%0A%7D

    现在,我将向您展示的一些内容组合到一个新查询中:

    SELECT ?s ?page WHERE {
     ?s a <http://dbpedia.org/class/yago/CountySeatsInCalifornia> ;
     <http://dbpedia.org/ontology/wikiPageExternalLink> ?page .
    }

    我向上一个查询添加了一个额外的关系。 现在要问的是:“告诉我加利福尼亚州的所有县城以及与之相关的外部网页。” 这是一个强大的查询,能够对从Wikipedia自动提取的数据进行汇总。 您可以在此处查看结果。

    现在,在查询中更改一件简单的事情。 而不是查询属于http://dbpedia.org/class/yago/CountySeatsInCalifornia类成员的资源,请使用http://dbpedia.org/class/yago/CapitalsInEurope

    SELECT ?s ?page WHERE {
     ?s a <http://dbpedia.org/class/yago/CapitalsInEurope> ;
       <http://dbpedia.org/ontology/wikiPageExternalLink> ?page .
    }

    结果在这里可用 仅更改类名称,什么都不会导致结果现在反映出与欧洲大陆国家的首都相关的外部网页!

    如果我要更改的关系与以这种方式分类的资源链接,则可以提出另一个完全不同的问题。 此查询询问纬度和经度信息,而不是外部链接:

    SELECT ?s ?lat ?long WHERE {
     ?s a <http://dbpedia.org/class/yago/CapitalsInEurope> ;
       <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?lat ;
       <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?long .
    }
    ORDER BY ?s

    结果可在此处获得

    想象从这样的查询中检索信息并将其显示在Google Maps上应该不是什么大的飞跃。 这样做的结果如图3所示,您可以在此处与结果进行交互。 考虑一下要更改多少代码才能找到并可视化欧洲国家所有国家元首的出生地。 (提示:几乎没有。)

    图3.来自DBpedia的欧洲首都城市
    来自DBpedia的欧洲首都

    现在您已经具备了相应的机制,不难想象如何提出关于任意域的其他类型的问题。 我最喜欢的DBpedia查询(是我从Bob DuCharme那里得到的)是从“辛普森一家”的每一集中找到每个黑板上的 科打ag。 当您单击该链接时,请记住,每个剧集也是一个资源,其中包含指向该剧集的导演,特别嘉宾,特色人物等的链接。 每个情节被归类为特定年份的一组电视节目的成员。 通过关注这些课程的成员链接,您可以找到大致在同一时间播出的其他电视剧集。

    在这一点上,DBpedia可以提出的问题种类有限。 并且请记住,DBpedia只是LOD云中近600个数据集之一。 链接数据只需花费很少的人力即可产生令人印象深刻的结果。

    结论

    考虑您的组织需要多长时间来集成单个新数据源。 链接数据是解决问题的根本不同方法,该问题可以在生产力,规模和灵活性级别上起作用,如果您拥有的所有解决方案都是与企业和编程语言相关的解决方案,则很难想象。 关于此方法的任何内容均不限制其适用于面向公众的数据。 您可以轻松地在防火墙后面应用相同的想法。

    链接数据不是魔术。 解析为标准数据模型的标准序列化的标准标识符是一组简单的概念(尽管可能不是直观的)。 但是,从工程角度看,在网络上公开支持SPARQL协议是一件非常困难的事情。 很难预测随机个体将对您的服务器施加什么样的负载。 为了保持DBpedia的正常运行,我们付出了巨大的努力。 您可以在网站上阅读有关该过程的更多信息。

    在下一篇文章中,我将向您介绍基于这些思想的软件平台,最后开始向您介绍选择沿着这一道路前进的开放服务生命周期协作(OSLC)技术。


    翻译自: https://www.ibm.com/developerworks/web/library/wa-data-integration-at-scale_linked-data/index.html

    关联数据库中多张表

    展开全文
  • <div><p>数据为了统一,想从数据库中查询,拼装,不知道可以吗? 可以的话如何拼装呢</p><p>该提问来源于开源项目:tshi0912/city-picker</p></div>
  • MySQL数据表字段值为NULL应该如何处理发布时间:2020-06-03 14:10:00来源:51CTO阅读:116作者:三月不知道大家之前对类似MySQL数据表字段值为NULL应该如何处理的文章有无了解,今天我在这里给大家再简单的讲讲。...

    MySQL数据表字段值为NULL应该如何处理

    发布时间:2020-06-03 14:10:00

    来源:51CTO

    阅读:116

    作者:三月

    不知道大家之前对类似MySQL数据表字段值为NULL应该如何处理的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完MySQL数据表字段值为NULL应该如何处理你一定会有所收获的。在创建数据表过程中,有的数据字段要设置数据值,可以默认值,可以为空 null ,当时在查询语句对字段不起作用,那么mysql使用什么关键词呢,IS NULL,IS NOT NULL,下面细说其用法。

    1,创建数据表

    create table dc3688_test_tbl

    -> (

    -> dc3688_author varchar(40) NOT NULL,

    -> dc3688_count  INT

    -> );

    2,查询不起作用

    mysql> SELECT * FROM dc3688_test_tbl WHERE dc3688_count = NULL;

    Empty set (0.00 sec)

    mysql> SELECT * FROM dc3688_test_tbl WHERE dc3688_count != NULL;

    Empty set (0.01 sec)

    3,用IS NULL,IS NOT NULL

    SELECT * FROM dc3688_test_tbl WHERE runoob_count IS NULL

    SELECT * from dc3688_test_tbl WHERE runoob_count IS NOT NULL

    4,php处理null

    使用关键词 isset($count )

    看完MySQL数据表字段值为NULL应该如何处理这篇文章,大家觉得怎么样?如果想要了解更多相关,可以继续关注我们的行业资讯板块。

    展开全文
  • VC++使用ADO访问读取数据库中记录,不知道如何使用ADO读取Access数据库的VC++入门学者,你可不要错过这个小实例,通过它你将学会VC++操作数据库的基础知识,最基础的一步——读取记录,由此你还可学习一下Datagrid...
  • 我们知道JSON数据格式被广泛使用在很多的应用,它可以帮我们保存我们应用的设置数据等。在QML的ListView或GridView,我们使用ListModel来显示它里面的数据。这个数据可以来源于xml或JSON。在ListView或...

    我们知道JSON数据格式被广泛使用在很多的应用中,它可以帮我们保存我们应用的设置数据等。在QML中的ListViewGridView中,我们使用ListModel来显示它里面的数据。这个数据可以来源于xml或JSON。在ListView或GridView中,我们也可以动态修改ListModel中的数据。那么我们将如何保存这个数据呢?本篇文章也同样适用于xml格式的保存。这个练习就留个开发者自己了。当然保存ListModel中的数据也可以使用到SQLite数据库。这个因人而已!


    为了方便我们的设计,我们使用了Ubuntu SDK中提供的“QML App with C++ plugin (qmake)”。这个项目的模版只适用于15.04及以上的target(在14.10中不被支持)。




    在plugin中,我们设计了如下的fileio.cpp文件:


    fileio.cpp

    #include <QStandardPaths>
    #include "fileio.h"
    
    FileIO::FileIO(QObject *parent) : QObject(parent)
    {
    }
    
    FileIO::~FileIO()
    {
    }
    
    void FileIO::read()
    {
        if(m_path.isEmpty()) {
            return;
        }
    
    //    QFile file(m_path.toLocalFile());
        QFile file(m_path.path());
    
        if(!file.exists()) {
            qWarning() << "Does not exits: " << m_path.toLocalFile();
            return;
        }
        if(file.open(QIODevice::ReadOnly)) {
            QTextStream stream(&file);
            m_text = stream.readAll();
            emit textChanged(m_text);
            qDebug() << "Text has been successfully read!";
        }
    }
    
    void FileIO::write()
    {
        if(m_source.isEmpty()) {
            return;
        }
    
        qDebug() << "filename: " << m_path.fileName();
        qDebug() << "path: " << m_path.path();
    
        QFile file(m_path.path());
        qDebug() << "File path: " << file.fileName();
    
        if(file.open(QIODevice::WriteOnly)) {       
            QTextStream stream(&file);
            stream << m_text;
            qDebug() << "Successfully write to file";
        } else {
            qWarning() << "Failed to write to the file: " << m_path;
        }
    }
    
    QString FileIO::source() const
    {
        return m_source;
    }
    
    QString FileIO::text()
    {
        qDebug() << "Going to read the text";
        read();
        return m_text;
    }
    
    void FileIO::setSource(QString source)
    {
        if (m_source == source)
            return;
    
        m_source = source;
        emit sourceChanged(source);
    
        // at the same time update the path
        m_path = QUrl(getFilePath(source));
    }
    
    void FileIO::setText(QString text)
    {
        if (m_text == text)
            return;
    
        m_text = text;
        write();
        emit textChanged(text);
    }
    
    QString FileIO::getFilePath(const QString filename) const
    {
    //    QString APP_ID = getenv("APP_ID");
    //    QString app_pkgname = APP_ID.split('_')[0];
    //    QString path = getenv("XDG_DATA_HOME") +
    //            "/" + app_pkgname + "/" + filename;
    //    qDebug() << "path: " << path;
    //    return path;
    
        QString writablePath = QStandardPaths::
                writableLocation(QStandardPaths::DataLocation);
        qDebug() << "writablePath: " << writablePath;
    
        QString absolutePath = QDir(writablePath).absolutePath();
        qDebug() << "absoluePath: " << absolutePath;
    
        // We need to make sure we have the path for storage
        QDir dir(absolutePath);
        if ( dir.mkdir(absolutePath) ) {
            qDebug() << "Successfully created the path!";
        }
    
        QString path = absolutePath + "/" + filename;
    
        qDebug() << "path: " << path;
    
        return path;
    }
    

    在这里特别值得指出的是,由于Ubuntu应用的security,每个应用只有自己的独特的目录可以访问。在这个文件中,我们使用了Qt API QStandardPaths来获得应用的私有目录来访问。在以前的文章“如何使用Ubuntu手机平台中的照相机API来存储照片”中,我们也曾尝试使用环境变量的方法来获取这个目录,但是这些环境变量在电脑Desktop的环境中没有设置。


    我们的主程序Main.qml也非常简单:

    Main.qml

    import QtQuick 2.4
    import Ubuntu.Components 1.2
    import Savejson 1.0
    import "savedata.js" as Data
    
    /*!
        \brief MainView with a Label and Button elements.
    */
    
    MainView {
        // objectName for functional testing purposes (autopilot-qt5)
        objectName: "mainView"
    
        // Note! applicationName needs to match the "name" field of the click manifest
        applicationName: "savejson.liu-xiao-guo"
    
        /*
         This property enables the application to change orientation
         when the device is rotated. The default is false.
        */
        //automaticOrientation: true
    
        width: units.gu(60)
        height: units.gu(85)
    
        Page {
            id: mainPage
            title: i18n.tr("savejson")
            property string path: ""
    
            FileIO {
                id: fileio
                source: "sample.json"
            }
    
            // The model:
            ListModel {
                id: fruitModel
    
                objectName: "fruitModel"
    
                ListElement {
                    name: "Apple"; cost: 2.45
                    image: "pics/apple.jpg"
                    description: "Deciduous"
                }
                ListElement {
                    name: "Banana"; cost: 1.95
                    image: "pics/banana.jpg"
                    description: "Seedless"
                }
                ListElement {
                    name: "Cumquat"; cost: 3.25
                    image: "pics/cumquat.jpg"
                    description: "Citrus"
                }
                ListElement {
                    name: "Durian"; cost: 9.95
                    image: "pics/durian.jpg"
                    description: "Tropical Smelly"
                }
            }
    
            Component {
                id: listDelegate
    
                ListItem {
                    id: delegateItem
                    width: listView.width; height: units.gu(10)
                    onPressAndHold: ListView.view.ViewItems.dragMode =
                                    !ListView.view.ViewItems.dragMode
    
                    Image {
                        id: pic
                        height: parent.height - units.gu(1)
                        width: height
                        anchors.verticalCenter: parent.verticalCenter
                        anchors.left: parent.left
                        anchors.leftMargin: units.gu(0.5)
                        source: image
                    }
    
                    Column {
                        id: content
                        anchors.top: parent.top
                        anchors.left: pic.right
                        anchors.leftMargin: units.gu(2)
                        anchors.topMargin: units.gu(1)
                        width: parent.width - pic.width - units.gu(1)
                        height: parent.height
                        spacing: units.gu(1)
    
                        Label {
                            text: name
                        }
    
                        Label { text: description }
    
                        Label {
                            text: '$' + Number(cost).toFixed(2)
                            font.bold: true
                        }
                    }
    
    
                    trailingActions: ListItemActions {
                        actions: [
                            Action {
                                iconName: "add"
    
                                onTriggered: {
                                    console.log("add is triggered!");
                                    fruitModel.setProperty(index, "cost", cost + 0.25);
                                }
                            },
                            Action {
                                iconName: "remove"
    
                                onTriggered: {
                                    console.log("remove is triggered!");
                                    fruitModel.setProperty(index, "cost", Math.max(0,cost-0.25));
                                }
                            },
                            Action {
                                iconName: "delete"
    
                                onTriggered: {
                                    console.log("delete is triggered!");
                                    fruitModel.remove(index)
                                }
                            }
                        ]
                    }
    
                    color: dragMode ? "lightblue" : "lightgray"
    
                    ListView.onAdd: SequentialAnimation {
                        PropertyAction { target: delegateItem; property: "height"; value: 0 }
                        NumberAnimation { target: delegateItem; property: "height"; to: delegateItem.height; duration: 250; easing.type: Easing.InOutQuad }
                    }
    
                    ListView.onRemove: SequentialAnimation {
                        PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: true }
                        NumberAnimation { target: delegateItem; property: "height"; to: 0; duration: 250; easing.type: Easing.InOutQuad }
    
                        // Make sure delayRemove is set back to false so that the item can be destroyed
                        PropertyAction { target: delegateItem; property: "ListView.delayRemove"; value: false }
                    }
                }
    
            }
    
            ListView {
                id: listView
                anchors.fill: parent
                anchors.margins: 20
                model: fruitModel
                delegate: listDelegate
    
                ViewItems.onDragUpdated: {
                    if (event.status === ListItemDrag.Moving) {
                        model.move(event.from, event.to, 1);
                    }
                }
                moveDisplaced: Transition {
                    UbuntuNumberAnimation {
                        property: "y"
                    }
                }
            }
    
            Row {
                anchors.bottom: parent.bottom
                anchors.horizontalCenter: parent.horizontalCenter
                anchors.bottomMargin: units.gu(1)
                spacing: units.gu(1)
    
                Button {
                    id: save
                    text: "Save JSON"
    
                    onClicked: {
                        console.log("Going to save data!")
                        var data = fruitModel;
                        console.log("model data: " + JSON.stringify(fruitModel, null, 4));
    
                        var res = Data.serialize(data);
                        console.log("res: " + res);
                        fileio.text = res;
                    }
                }
    
                Button {
                    id: load
                    text: "Load JSON"
    
                    onClicked: {
                        var json = JSON.parse(fileio.text);
                        console.log("count: " + json.fruits.length);
    
                        fruitModel.clear();
                        var count = json.fruits.length;
                        for (var i in json.fruits) {
                            var fruit = json.fruits[ i ];
                            console.log("name: " + fruit.name);
                            console.log("image: " + fruit.image );
                            console.log("description: " + fruit.description);
                            console.log("cost: " + fruit.cost);
                            fruitModel.append( fruit );
                        }
    
                    }
                }
    
            }
        }
    }
    


    运行我们的应用,我们的界面如下:


       


     


    我们创建了一个ListView列表。在列表中,我们可以通过“+”及“-”来修改水果的价钱,我们也可以删除一个水果。当然,我们也可以长按列表并移动列表中的项来重新排序我们的水果顺序。


    最重要的是,我们可以通过FileIO来存储或读取我们所需要的JSON文件。为了方便,我们设置了一个“sample.json”。它在电脑中的路径为“:~/.local/share/savejson.liu-xiao-guo$”。


    我们使用了如下的方法来存储我们的JSON文件格式:


    function serialize(model) {
        var res = "{ \"fruits\": [\n";
    
        console.log("count: " + model.count);
    
        for(var i = 0; i < model.count; ++i) {
            res += "\n{\t";
            var e = model.get(i);
            res += "\"name\": \""   + e.name + "\",\n\t";
            res += "\"image\": \"" + e.image + "\",\n\t";
            res += "\"description\": \"" + e.description + "\",\n\t";
            res += "\"cost\": " + e.cost + "\n\t";
    
            // The last one should not have the ending ","
            if ( i === model.count -1)
                res += "\n}";
            else
                res += "\n},";
        }
    
        res += "\n]}";
    
        console.log("res: " + res );
        return res;
    }

    存储的JSON文件例子为:


    { 
    "fruits": [
    
    	{       "name": "Banana",
    	        "image": "pics/banana.jpg",
    	        "description": "Seedless",
    	        "cost": 2.2
    	
    	},
    	{       "name": "Cumquat",
    	        "image": "pics/cumquat.jpg",
    	        "description": "Citrus",
    	        "cost": 3.25
    	
    	},
    	{       "name": "Durian",
    	        "image": "pics/durian.jpg",
    	        "description": "Tropical Smelly",
    	        "cost": 9.95
    	
    	}
    	]
    }
    


    在我们修改完设置后,我们可以选择退出应用。在下次启动应用后,我们可以选择“Load JSON”按钮,我们可以看到上次修改的内容被成功地重新装载到应用中。


    整个项目的源码在: https://github.com/liu-xiao-guo/savejson




    展开全文
  • 1.什么是多表关联顾名思义:多表关联指的就是多个表之间的连接关系,为什么要了解多表关联?大家都知道目前我们生活在互联网时代,基本上离开互联网无法生存,每天都会浮...一个用户提供的信息存储到数据库中供其它...
  • PHP数据库操作面向对象的优点发布时间:2016-06-17 来源: 点击:次我们都知道如何从Mysql获取我们需要的行(记录),读取数据,然后存取一些改动。很明显也很直接,在这个过程背后也没有什么拐弯抹角的。然而对于我们...
  • #01 缘起事情的来源,要源于项目的一部分数据,为了“安全”需要,存入数据库之前,是需要加密的。这个加密方式呢,就是AES-192。而对应的数据,不好说,谁知道有啥不可描述的数据呢。而项目,是基于 Node.js 的。...
  • #01 缘起事情的来源,要源于项目的一部分数据,为了“安全”需要,存入数据库之前,是需要加密的。这个加密方式呢,就是AES-192。而对应的数据,不好说,谁知道有啥不可描述的数据呢。而项目,是基于 Node.js 的。...
  • 因为上报要求对变更进行上报,当采集系统不能提供变更情况时,需要上报系统根据当天数据和前一次存储的数据进行比较之后才能知道发生了哪些业务变更。因此本系列的表需要对上报的数据保存本期和两期的数据。 CDBEC...
  • 内容主要集中在大多数企业常见的问题之上,如安装和升级到oracle database 11g数据库软件、创建数据库、导出和导入数据数据库的备份与恢复、性能调优,等等。  本书还提供了dba完成本职工作必备的基本的uniix...
  • 轻松解决PostgreSQL数据库的操作问题

    万次阅读 2010-10-20 10:47:00
    轻松解决PostgreSQL数据库的操作问题 ...如果你只是要提取几行数据,并且你在执行查询中知道确切的行数,你可以使用LIMIT功能。 如果有一个索引与 ORDER BY的条件匹配,PostgreSQL 可能就只处理要求的头几条记
  • 在(上)...这一节呢,我们对数据库s-c下的j表进行增删改查(默认是知道数据库的操作咯)接下来我们来看看表的属性,一共就3个属性:该表来源于课本示例然后我们来说说java这边。先给大家看一下项目...
  • 在(上)...这一节呢,我们对数据库s-c下的j表进行增删改查(默认是知道数据库的操作咯)接下来我们来看看表的属性,一共就3个属性:该表来源于课本示例然后我们来说说java这边。先给大家看一下项目...
  • 1.情景展示如上图所示,按日期进行数据统计,我们知道数据来源肯定是数据库,一旦指定时间段,必然存在日期空缺的情况(也就是当天没有产生数据)除了使用SQL填补空缺日期记录外,有时我们不得不在java做处理,...
  •  本书发行之时,恰逢Oracle 11gR2 发布,新版本的设计已经开始面向数据中心,增加了更多的技术特性,DBA们的眼光,也不再局限于数据库本身,而应该放眼更大的数据中心,建设这个更大的主题。因此,更希望本书对于...
  • 1.情景展示如上图所示,按日期进行数据统计,我们知道数据来源肯定是数据库,一旦指定时间段,必然存在日期空缺的情况(也就是当天没有产生数据)除了使用SQL填补空缺日期记录外,有时我们不得不在java做处理,...
  • 日常工作利用SQL SQLSERVER 2008的维护计划对数据库进行定期自动备份,这样一方面可以对数据库进行备份保证数据安全,另一方面也可以减轻对维护人员的负担。本文我们就介绍SQL Server 2008创建自动备份任务的方法...
  • 所有文章标题和链接都保留在数据库中,以便历史数据得以保留。 通过跟踪一段时间内的新闻故事,可以获得更多的见解。 该应用程序托管在,旨在帮助平衡各地用户的媒体消费! 演示版 发展哲学 除了提供所述的高级功能...
  • 平时都常用搜索框,应该用的都是在线搜索,应该是在数据库中查询信息。但什么是离线搜索呢?在阿里工程中把“将各种来源数据转换处理后送入搜索引擎等‘在线’服务的系统称为“离线”系统。离线系统是一个大...
  • 然后我在新的项目job去掉了所有协程,只保留数据库操作部分.结果还是会出现很多格式A. 再下一步我怀疑是不是redis的db有什么问题</strong>?于是我换成了本地的redis,然后又换了线上的db8.分别测试20条任务,都是好...
  • 机房收费系统之安装

    2018-09-03 10:35:15
    数据库建立好之后,要设定系统的 DSN(数据来源名称),才能让网页可以知道数据库所在的位置以及数据库相关的属性。使用DSN的好处还有,如果移动数据库档案的位置,或是换成别种类型的数据库,只要重新...
  • 在工作遇到了MySQL中如何存储长度较长的字段类型问题,于是花了一周多的时间抽空学习了一下,并且记录下来。 <p>MySQL大致的逻辑存储结构在这篇文章有介绍,做为基本概念:...
  • 由于后端通常采用的是关系型数据库,所以返回的数据通常会是这个样子: <pre><code> js var data = [{ "province": "浙江", "city": "杭州", "name": &...
  • 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这也就是持久层框架所具备的功能,那既然已经有了JDBC了,为什么还要用持久层框架呢? ...
  • 但是我不知道如何写才能实现我上面的设想。 <p>The first solution shows as below: 我一开始的解决方案如下: <pre><code>sql save append resTable as jdbc.`mydb.test1` options mode="...
  • scikit-learn 文本挖掘概念

    千次阅读 2017-05-06 09:56:08
    数据来源是文档集合,不是形式化的数据库记录,是非结构化的文本数据集合。 将文字转化为数字,算法可以应用到大型文档数据库。将文本转化为结构化,数字格式,并应用分析算法需要知道如何使用和整合这些技术来处理...
  • Mysql主从延迟处理方案

    千次阅读 2019-04-02 18:15:59
    问题来源 之前有同事问我,主从延迟如何处理啊。其实这个问题一般面试题的时候也都会问道大家,...那么当一个请求往主库里面写的时候,同时会同步一份数据写到从库。如果此时从库处于非常繁忙的状态,就会出现主...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

如何知道数据库中数据来源