精华内容
下载资源
问答
  • 由于某种原因客户数据库中 trp_advp部分记录的projectname和groupname两个字段值丢失,由于trp_reportitem 中可以找到对应的数据,于是通过该进行数据还原.trp_advp中一条记录对应trp_reportitem中的多条记录,...

    由于某种原因客户数据库中 trp_advp表部分记录的projectname和groupname两个字段值丢失,由于trp_reportitem 表中可以找到对应的数据,于是通过该表进行数据还原.trp_advp中一条记录对应trp_reportitem中的多条记录,因此需要对trp_reportitem分组查询,赋值的条件为trp_advp.id=trp_reportitem.advp_id

    注意:trp_advp和结果集item的记录数要相同

    update trp_advp set(trp_advp.projectname,trp_advp.groupname)=(
      select item.project_name,item.group_name 
      from (
        select advp_id,group_name,project_name from trp_reportitem group by advp_id,group_name,project_name
      ) item where trp_advp.id=item.advp_id
    )

     

    展开全文
  • 在这种情况下,通常的做法是把原有的个系统修改一下做个集成,先凑合用着得了。如果要对原有的系统做功能提升的话,肯定要重用原来的数据库结构并做一些小的改进,在这种情况下我们怎样使用Code First呢?我们可以...

    本篇日记我们将详细探讨如何将表现领域的类映射到现有的数据库。现在的经济形势不是太好,很多公司都取消了开发新系统的预算。在这种情况下,通常的做法是把原有的几个系统修改一下做个集成,先凑合用着得了。如果要对原有的系统做功能提升的话,肯定要重用原来的数据库结构并做一些小的改进,在这种情况下我们怎样使用Code First呢?我们可以按照原有系统的业务逻辑和CR(Change Request)中的新业务逻辑建立domain中的类,然后使用Fluent API把这些类映射到原有数据库的表中,或修改原有系统的数据结构。我相信通过前几篇的日记,大家已经知道了怎样去自定义各个方面的数据库映射了。这种方法虽然给我们机会重新审视我们的业务逻辑,但是原有系统中许多没有变化的部分也需要按照Code First的方法重头创建类并映射到原有的数据表,给我们的开发带来了很多不必要的工作量。为了提高我们的开发效率,减少在使用Code First升级系统时不必要的工作量,微软发明了Entity Framework Power Tools. 这个工具可以使用反向工程,在原有数据库的基础上生成Code First中使用的纯粹代表domain的类和数据库映射配置。博客园上有很多关于这个工具的介绍,大家可以上博客园搜索。这个工具虽然很好,但是他只能帮你减少你的工作量,不可能完全替代你的工作。比如说原来的数据库中有一个表,你经过对业务逻辑的分析,发现表中的字段应该属于两个类,但是你还不能改变现有的数据库结构,这种情况需要你自己配置数据库映射来搞定。或者原来数据库中的两个表,在你的新的业务逻辑中属于同一个类,也给根据特定的业务逻辑进行数据库映射的配置。所以我今天主要介绍如何解决以上的两个问题。

    1.在不修改数据库结构的前提下,如何将两个类映射到同一个数据库表。

    2.在不修改数据库结构的前提下,如何将一个类映射到两个数据库表。

     

    1.在不修改数据库结构的前提下,如何将两个类映射到同一个数据库表。

    我们已经介绍过一种将两个类映射成一个表的方法:ComplexType,今天我们将介绍另外一种方法。

    假设我们的原有数据库中有一个Customer表,结构如下:

    image

    我们在对现有系统进行升级改造的时候,使用了Code First。请大家注意,这个表中我用红色方框标识出来列,从业务逻辑上来说,并不是客户信息的一部分,而是客户的银行账号信息。按照业务逻辑中的实际情况,我们建立了两个类:Customer和BankAccount。

    Customer类:

    public class Customer
    {
          public string IDCardNumber { get; set; }
          public string CustomerName { get; set; }
          public string Gender { get; set; }
          public Address Address { get; set; }
          public string PhoneNumber { get; set; }
          public BankAccount Account { get; set; }
    }

    BankAccount类:

    public class BankAccount
        {
            public string AccountNumber { get; set; }
            public DateTime CreatedDate { get; set; }
            public string BankName { get; set; }
            public string AccountName { get; set; }
        }

    如果我们需要让Code First把这两个类映射到同一个表,这两个还必须满足两个条件:

    1.两个类必须共享同一个主键。

    2.两个类之间的关系必须被映射为表之间的一对一关系。

    为了满足这两个条件,我们首先需要修改BankAccount类,让BankAccount类使用与Customer类同样的主键。

    public class BankAccount
        {
            public string IDCardNumber { get; set; }
            public string AccountNumber { get; set; }
            public DateTime CreatedDate { get; set; }
            public string BankName { get; set; }
            public string AccountName { get; set; }
        }

    我们还必须在Customer的数据库配置类中手动地映射这两个类之间的一对一关系。

    HasRequired(c => c.Account).WithRequiredDependent();

    满足了以上的两个条件之后我们还必须使用ToTable方法手动地把这两个映射到同一个表。

    public class CustomerEntityConfiguration:EntityTypeConfiguration<Customer>
        {
            public CustomerEntityConfiguration()
            {
                ToTable("Customers");
                HasKey(c => c.IDCardNumber).Property(c => c.IDCardNumber).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).HasMaxLength(50);
                Property(c => c.IDCardNumber).HasMaxLength(20);
                Property(c => c.CustomerName).IsRequired().HasMaxLength(50);
                Property(c => c.Gender).IsRequired().HasMaxLength(1);
                Property(c => c.PhoneNumber).HasMaxLength(20);
                HasRequired(c => c.Account).WithRequiredDependent();
            }
        }

     

    public class BankAccountValueObjectConfiguration: EntityTypeConfiguration<BankAccount>
        {
            public BankAccountValueObjectConfiguration()
            {
                ToTable("Customers");
                HasKey(ba => ba.IDCardNumber).Property(ba => ba.IDCardNumber).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).HasMaxLength(20);
                Property(ba => ba.AccountNumber).IsRequired().HasMaxLength(50);
                Property(ba => ba.AccountName).IsRequired().HasMaxLength(100);
                Property(ba => ba.BankName).IsRequired().HasMaxLength(100);
            }
        }

     

    我们修改一下以前使用的单元测试方法来测试Code First是否把这两个类映射到同一个表:

     [TestMethod]
            public void CanAddCustomerWithBankAccount()
            {
                OrderSystemContext unitOfWork = new OrderSystemContext();
                CustomerRepository repository = new CustomerRepository(unitOfWork);
                Customer newCustomer = new Customer() { IDCardNumber = "120104198106072518", CustomerName = "Alex", Gender = "M", PhoneNumber = "test" };
                Address customerAddress = new Address { Country = "China", Province = "Tianjin", City = "Tianjin", StreetAddress = "Crown Plaza", ZipCode = "300308" };
                BankAccount account = new BankAccount { IDCardNumber = "120104198106072518", AccountNumber = "2012001001", BankName = "ICBC", AccountName = "Alex", CreatedDate = DateTime.Parse("2012-1-21") };
                newCustomer.Address = customerAddress;
                newCustomer.Account = account;
                repository.AddNewCustomer(newCustomer);
                unitOfWork.CommitChanges();
            }

     

    执行完测试方法之后,我们打开数据库看一下Code First映射出的数据库结构是否与我们原来的数据库结构一样。

    image

    通过手动地将这两个类映射成同一个表,使我们的代码可以再不修改原有数据库结构的基础上根据业务逻辑重构我们的代码。

     

    2.在不修改数据库结构的前提下,如何将一个类映射到两个数据库表

    假设我们原有的数据库中有两个表,一个是ProductCatalog,另一个是ProductCatalogPhoto。ProductCatalog表存储某类产品的信息,但是后来加新需求的时候,需要显示该类产品的照片和对照片的描述。不知道是哪位仁兄不敢动ProductCatalog表,直接加了一个ProductCatalogPhoto表。现在轮到我们升级系统的时候,就会面临下面这样的数据库结构:

    image

    但是傻子都能看出来,从ProductCatalog和ProductCatalogPhoto两个表创建出两个类肯定是不符合业务逻辑的。我们就需要创建ProductCatalog类,它应该既包括某类产品的信息,也应该包括该类产品的照片和对照片的描述。

    public class ProductCatalog
        {
            public int ProductCatalogId { get; set; }
            public string CatalogName { get; set; }
            public string Manufactory { get; set; }
            public decimal ListPrice { get; set; }
            public decimal NetPrice { get; set; }
            public List<Product> ProductInStock { get; set; }
            public List<SalesPromotion> SalesPromotionHistory { get; set; }
            public byte[] Photo { get; set; }
            public string PhotoDescription { get; set; }
    
           .............
        }

     

    在不改变原来数据库结构的情况下,我们就需要通过手动配置将ProductCatalog类映射到ProductCatalog和ProductCatalogPhoto两个表。

    public class ProductCatalogEntityConfiguration:EntityTypeConfiguration<ProductCatalog>
        {
            public ProductCatalogEntityConfiguration()
            {
                this.Property(c => c.CatalogName).HasMaxLength(200).IsRequired();
                this.Property(c => c.Manufactory).HasMaxLength(200);
                this.Property(c => c.ListPrice).HasPrecision(18, 4);
                this.Property(c => c.NetPrice).HasPrecision(18, 4);
                this.HasKey(c => c.ProductCatalogId);
                Map(c =>
                {
                    c.Properties(p => new {p.CatalogName,p.Manufactory,p.ListPrice,p.NetPrice});
                    c.ToTable("ProductCatalog");
                });
                Map(c =>
                {
                    c.Properties(p => new {p.Photo,p.PhotoDescription});
                    c.ToTable("ProductCatalogPhoto");
                });
    
            }
        }

    我们通过Map方法,首先选择类的属性,然后将选择的属性列表映射到某个数据库表。

    我们在我们的测试程序里新加一个单元测试,测试一下,Entity Framework Code First是不是将这个类实例持久化到两个表中。

            [TestMethod]
            public void CanAddNewProductCatalogWithPhoto()
            {
                OrderSystemContext unitOfWork = new OrderSystemContext();
                ProductRepository repository = new ProductRepository(unitOfWork);
                ProductCatalog catalog = new ProductCatalog() { CatalogName = "DELL Laptop E6400", Manufactory = "DELL", ListPrice = 6000, NetPrice = 5000, Photo = new byte[] { 0 }, PhotoDescription = "E6400" };
                repository.AddNewProductCatalog(catalog);
                unitOfWork.CommitChanges();
            }

     

    执行完这个单元测试程序之后,我们可以到数据库中查询一下,看看是不是我们想要的结果:

    image

    大家可以看到,Entity Framework Code First已经将ProductCatalog 类的实例持久化到ProductCatalog和ProductCatalogPhoto两个表中。

    转载于:https://www.cnblogs.com/yunxiaguo/p/5819436.html

    展开全文
  • 正如广大开发人员所知道的,多表关联查询是对一张表的某个字段来匹配另一张表对应字段,进而从另外一张表里查询对应的属性。这里大家一般采用join查询,此类查询这里分为left join、right join、inner join、cross...

    在阿里巴巴开发手册里有这样一条规定,禁止关联三张及以上的数据库表。这个是为何呢?笔者在之前工作中有了亲身的体验,现在对其进行总结。
    正如广大开发人员所知道的,多表关联查询是对一张表的某个字段来匹配另一张表的对应字段,进而从另外一张表里查询对应的属性。这里大家一般采用join查询,此类查询这里分为left join、right join、inner join、cross join这几种。其中,left join是把前面的表作为主表进行全表扫描的,而right join是把右表进行主表全表扫描的。另外两种则是把数目多的表作为主表进行全表扫描的。如果子表对应字段不加入索引,则子表也是根据对应的字段进行全表循环扫描(Block Nested-loop Join)。相反,加入索引之后,子表则是根据索引进行扫描的,效率明显提高。
    在关联三张以上的表时,对第二个子表也是再次全表进行扫描,效率明显下降了,耗时超过1秒。而理想的查询耗时是在1秒之内,同时前端的响应耗时默认在30秒,最多在两分钟,超过时间则报服务器无响应的错误。这很好地解释了阿里为何不同意三张及以上的表关联。
    除此之外,阿里巴巴官方文档不同意使用外键和级联。这是因为外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。对于外键方面,阿里方面建议采用业务逻辑层来处理对应的,使用适当的冗余,同时要字段类型名称相等。
    在常见的orm框架中,mybatis是半自动化的,可以灵活地解析和优化sql语句;而hibernate是全自动化的,解析qbc和hql对应的sql明显包含了三张及以上的表还有外键,查询的效率十分低下,其自动建表的功能除了引入外键之外还不支持普通索引和联合索引。所以,阿里官方建议采用人工建表的方式创建数据库表,并通过逆向工程生成出对应的实体类和dao层。笔者在之前的工作吃尽了hibernate的槽点,最终改换orm框架为mybatis。

    展开全文
  • 数据库表分区

    2017-05-21 16:20:31
    分区后,表面上还是一张表,但数据散列到多个位置了。因为存储在不同的分区文件,所以搜索的时候要在对应的分区搜索,所以时间会快很多。分区感觉就是加快了数据库自身读取的速度,并行读取个小文件比单独读一个大...

     

    1.分区的意思

     

    分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。因为存储在不同的分区文件,所以搜索的时候要在对应的分区搜索,所以时间会快很多。分区感觉就是加快了数据库自身读取的速度,并行读取几个小文件比单独读一个大文件要快。用时间分表不建议,还不如干脆分区。因为时间越久,表越多,不好管理。

     

    主从表(不是分表)就是抽象出共有的作为主表,特有的作为从表。一般who what when why how里面,who what when就是主表,什么id,什么类型,什么时间一般就是主表。

     

     

    2.分区的操作

     

     

    1)分区策略

    Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
    Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
    Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
    List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
    Composite(复合模式) –以上模式的组合使用

     

    2)新建分区

    Range:(一般用在时间)
    create table range( 
      id int(11), 
      money int(11) unsigned not null, 
      date datetime 
      )partition by range(year(date))( 
      partition p2007 values less than (2008), 
      partition p2008 values less than (2009), 
      partition p2009 values less than (2010) 
      partition p2010 values less than maxvalue 
    );

    List:
    create table list( 
      a int(11), 
      b int(11) 
      )(partition by list (b) 
      partition p0 values in (1,3,5,7,9), 
      partition p1 values in (2,4,6,8,0) 
     );

    Hash:
    create table hash( 
      a int(11), 
      b datetime 
      )partition by hash (YEAR(b) 
      partitions 4;

    Key:
    create table t_key( 
      a int(11), 
      b datetime) 
      partition by key (b) 
      partitions 4;

     

     

    3)新增分区

     

     

    ALTER TABLE sale_data
    ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

     

     

    4)删除分区

     

     

    --当删除了一个分区,也同时删除了该分区中所有的数据。
    ALTER TABLE sale_data DROP PARTITION p201010;

     

     

    5)分区的合并

     

     

    下面的SQL,将p201001 - p201009 合并为3个分区p2010Q1 - p2010Q3
    ALTER TABLE sale_data
    REORGANIZE PARTITION p201001,p201002,p201003,
    p201004,p201005,p201006,
    p201007,p201008,p201009 INTO
    (
    PARTITION p2010Q1 VALUES LESS THAN (201004),
    PARTITION p2010Q2 VALUES LESS THAN (201007),
    PARTITION p2010Q3 VALUES LESS THAN (201010)
    );

    展开全文
  • 一张表遇到的问题

    2020-12-26 22:47:19
    最近做的一个模块,就是一张表的增删查,但是遇到的问题却不少,总结一下,为以后提个醒。 该项目是前后端分离,后端在开发时看不到页面,仅用postman调试;首先, 遇到的问题有以下点: 字段和前端没对应上;...
  • 业务实体有一个属性没有对应的字段,因此需要在数据库表加一个字段,又由于此字段要求不可为空,并且在开发阶段,测试数据不多,有时是drop掉了原来的表,增加了一个字段再重新建了一张表。有时一些表,设计表时会在...
  • 一张表说明AWS数据服务的功能特点

    千次阅读 2015-08-30 23:24:09
    数据是一个公司宝贵的资产。...为了理解什么场景应该使用什么数据服务,下面简单总结了个数据服务的特征(对应开源或商业组件,存储特性,快照,特征)。 针对各个数据库服务的快照功能,可以参考 ...
  • 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单据对应多个实体,或多原始单据对应一个实体。这里的实体可以理解为基本。明确这种对应关系后,对我们设计录入界面大有好处。 〖例1〗:一份员工...
  • 背景: 最近在做一个Java Web项目,SSH框架,MySQL数据库。...于是我在drop掉了原来的表,增加了一个字段再重新建了一张表。 按照通常的做法,设计数据库都会在后面加个类型为varchar的预...
  • [b]问题场景[/b] 每次节假日之前,公司的业务人员要通过我们开发的短信平台...通过show engine innodb status(在这里要感谢去年12月份世界末日前后吧,张瑞组织的AskHelloDBA数据库技术论坛,基本上那场除了慢...
  • 一张表里面查询最近7条的sql语句为: #表示查询最近的七条数据 SELECT * FROM student ORDER BY s_id DESC LIMIT 7; 而django中不能直接使用sql语句,其查询数据库使用ORM将python语言映射成对应的sql语句, ...
  • E entity 代表实体的意思 对应数据库当中的一张表 R relationship 代表关系的意思 ER模型 实体关系模型 Java OR Object relationship Hibernate、Mybatis ORM 对象关系映射 数据表中的那些键 数据库中的键(Key)...
  • 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多原始单证对应一个实体。这里的实体可以理解为基本。明确这种对应关系后,对我们设计录入界面大有好处。  二: 主键与外键 ...
  • 1. 创建表的联系1:1强实体联系:把一个表的主键作为另一张表的外键。为了强调最大粒度是1,应该把外键设置成候选键。1:N强实体联系:把1的那一段的表(父表)的键设置成对应N的那一端的表(子表)的外键。N:M强...
  • HBase客户端API-操作

    2018-01-29 09:13:25
    上一篇博客说了使用 HBase 的客户端 API 来操作管理 HBase 中的表,今天我们看看怎样通过 API 来操作表中的数据...Table 是表对象,对应数据库中的一张表,我们可以在表上执行添加,修改,删除和查询操作。 Put 主要是
  • 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多原始单证对应一个实体。 这里的实体可以理解为基本。明确这种对应关系后,对我们设计录入界面大有好处。 〖例1〗:一份员工...
  • 数据库设计多对多关系的种形态

    千次阅读 2009-06-08 15:57:00
    在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单据对应多个实体,或多原始单据对应一个实体。这里的实体可以理解为基本。明确这种对应关系后,对我们设计录入界面大有好处。 〖例1〗:一份员工履历...
  • 这两天笔者篇文章介绍了改数据库、实体-的文章. 联关文章的地址 1. 原始据单与实体之间的关系 可是以一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始据单对应且只对应一个实体...
  • 0.前言 需要从一个库导一个表的数据到另一个库 1.操作流程 选择目标数据库右键-》任务-》导入数据 下一步 ...我要复制一张表,就先第一个,继续下一步 找到对应的表勾选下一步 next 执行
  • 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多原始单证对应一个实体。这里的实体可以理解为基本。明确这种对应关系后,对我们设计录入界面大有好处。 二: 主键与外键 ...
  • 1、Entity : 对应数据库中的表,可以使用Entity注解将一个类变成数据库中的一张表结构。 2、DAO : 全称Database Access Object,定义了对数据库中数据的读写等操作,DAO中可以使用SQL语句来操作数据库。 3、...
  • 由于公司需求,想通过Excel导入数据添加到数据库中,而导入的Excel的字段是不固定的,使用得通过动态创建数据,每个Excel对应一张数据,怎么动态创建数据,请看上一篇博客。 下面主要讲讲怎么将Excel导入到...
  • 数据库中的视图

    2007-11-28 13:53:00
    所以视图不是真实存在的基础而是一张,视图所对应的数据并不实际地以视图结构存储在数据库中,而是存储在视图所引用的中。 视图一经定义便存储在数据库中,与其相对应的数据并没有像那样又在数据库中再...
  • 数据库的隔离级别指的是多个用户操作统一个数据库的同一张表时,相互影响的程度大小,数据库的隔离级别越高,数据库的相互影响的风险也就越小,但是对应数据库的运行效率也就越低,数据库总共有四种隔离级别,下面...
  • 多对多:建立第三方表,存储两张表主键的对应关系,将多对多拆分为两个一对多。 数据库多表查询的种方式 参考:多表查询 笛卡尔积查询:SELECT * FROM dept,emp WHERE emp.dept_id = dept.id; 内连接...
  • 1 DDL 使用DDL来管理数据库的对象。 那Oracle数据库中有哪个常用对象呢?表、视图、序列、索引、同义词、存储过程、存储函数、触发器、...1.1.1 如何通过子查询创建一张表? 1.1.2 如何查看当前用户下所存在...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 184
精华内容 73
关键字:

数据库一张表对应几张表