精华内容
下载资源
问答
  • 如何使用redis设计关系数据库 如何使用redis设计关系数据库 怎么用redis的数据类型设计一个关系数据库呢。 redis只有key-value这种存储结构,如果想利用它做成想其他数据库一样具备 增删改查等功能只能再设计了,...

    如何使用redis设计关系数据库

    如何使用redis设计关系数据库

    怎么用redis的数据类型设计一个关系数据库呢。

    redis只有key-value这种存储结构,如果想利用它做成想其他数据库一样具备 增删改查等功能只能再设计了,这里分享一下我的设计方法,比较简单,我不知道算不算好,只是网上找了很久没找到一种通用的方法,如果有什么好的方法,还想请教一下各位,十分感谢。

    设计用户信息表结构
    hash存储记录
    key值 : 域名:表名:主键
    value值 :直接使用redis的Hash类型
    如:

    test:accounts_info:0 id 0 accounts ailumiyana_0 password 123456 nick_name sola_0
    test:accounts_info:1 id 1 accounts ailumiyana_1 password 123456 nick_name sola_1
    test:accounts_info:2 id 2 accounts ailumiyana_2 password 123456 nick_name sola_2
    test:accounts_info:3 id 3 accounts ailumiyana_3 password 123456 nick_name sola_3
    在这里插入图片描述

    set存储id
    另添加一个set集存放表主键, 也即id.
    key值 : ids:域名:表名
    value值: id
    将已生成的用户id同时添加进set集合中.
    我这里用了list演示,不设计类型的特殊方法的话,演示效果是一样的。
    Alt text

    图示
    Alt text

    索引/查询:
    1、select
    查询所有记录 : 类似sql的select from table_name
    有了set表后我们就可以使用redis中sort的get方法,获取所有记录.
    sort ids:test:accounts_info get test:accounts_info:->accounts get test:accounts_info:->nick_name
    Alt text

    2、根据主键查询记录
    直接使用string类型建立主键到id的索引,其实id就是主键,但是我们一般不会用id去找记录,更多的使用account账号去找.
    key值 : 域名:表名:列键名:列键值
    这样我们直接用get 取得accounts的id 后再去hash中查找记录就行了.
    在这里插入图片描述

    3、其他列索引
    最后可以根据表的需要建立一些其他索引,
    方法同 2 ,使用类型不一定是set 哪个方便用哪个。
    例如 我要统计最近登录的10个用户的信息, 那么我直接用list 的 lrange limit 0 10 就能取到.
    Alt text

    c++ 实现
    以上设计的c++实现,其中的redis的客户端使用了cpp_redis库。

    例程中 :
    1、我创建了一张 account_info的表 默认使用accounts 作为主键

    2、插入4个用户信息.

    3、查询用户ailu_1的记录值.

    class table// : public redis::er_table
    {
    public:

    //! ctor

    table(void);
    //! dtor
    ~table(void) = default;

    //! copy ctor
    table(const table&) = delete;
    //! assignment operator
    table& operator=(const table&) = delete;

    public:
    //! vector type to save table records.
    typedef std::vector records_t;

    //! vector type to save table records entitys.
    typedef std::vector entitys_t;

    public:
    //! create table,
    //! default primary key is the records_t vec[0], if primary_key is empty!
    void create(const std::string& table_name, const records_t& vec, const std::string& primary_key = "");

    public:
    //! incr primary key id.
    std::string incr_id();

    //! insert new entity to table, pelease orderly insert refer to records vector !
    //! return false while entity exits.
    bool insert(const entitys_t& vec);

    //! get entitys by primary key value.
    entitys_t get_entitys_by_primary_key_value(const std::string& primary_key_value);

    private:
    //! get id by primary key value
    //! retrun "" while primary key inexitences.
    std::string get_id_by_primary_key_value(const std::string& primary_key_value);

    private:
    //! redis client
    cpp_redis::client m_redis_client;

    //!
    records_t m_records;

    //! records count.
    std::size_t m_records_count;

    //! ids set key
    std::string m_ids;

    //! table name
    std::string m_table_name;

    //! incr key
    uint64_t m_incr_key;

    //! primary key
    std::string m_primary_key;
    std::size_t m_primary_key_index;
    };

    table::table()
    :m_records_count(0),
    m_incr_key(0)
    {
    m_redis_client.connect();
    m_redis_client.select(3);
    m_redis_client.sync_commit();
    }

    void table::create(const std::string& table_name, const records_t& vec, const std::string& primary_key){
    assert(m_records_count == 0);
    m_ids = "ids:" + table_name;
    m_table_name = table_name;
    m_records = vec;
    m_records_count = vec.size();
    if(primary_key.empty()){

    m_primary_key = vec[0];
    m_primary_key_index = 0;

    } else {

    m_primary_key = primary_key;
    auto iter = std::find(vec.begin(), vec.end(), primary_key);
    if(iter == vec.end()){
      LOG_FATAL << "no such key.";
    }
    m_primary_key_index = iter - vec.begin();

    }

    }

    std::string table::incr_id(){
    return std::move(std::to_string(m_incr_key++));
    }

    std::string table::get_id_by_primary_key_value(const std::string& primary_key_value){

    std::future fu = m_redis_client.get(primary_key_value);
    m_redis_client.sync_commit();

    cpp_redis::reply reply = fu.get();

    if(!reply.is_null()){

    return std::move(reply.as_string());

    }

    LOG_DEBUG << "primary_key " << primary_key_value << " inexitences. return "".";

    return "";
    }

    bool table::insert(const entitys_t& vec){
    assert(m_records_count != 0);
    assert(m_records_count == vec.size());

    std::string get_id = incr_id();

    // check whether the primary key already exists.
    std::string check_id = get_id_by_primary_key_value(vec[m_primary_key_index]);
    if(!check_id.empty()){

    return false;

    }

    // redis string type primary key to id index.
    //LOG_DEBUG << m_table_name + ":" + m_records[m_primary_key_index] + ":" + vec[m_primary_key_index];
    m_redis_client.set(m_table_name + ":" + m_records[m_primary_key_index] + ":" + vec[m_primary_key_index], get_id);

    // redis set type to save id.
    std::vector id_vec = {get_id};
    m_redis_client.sadd(m_ids, id_vec);

    // redis hash type to save records key-value.
    std::vector> entitys_pair_vec;

    for(std::size_t i = 0; i < m_records_count; i++){

    entitys_pair_vec.emplace_back(make_pair(m_records[i], vec[i]));

    }

    m_redis_client.hmset(m_table_name + ":" + get_id, entitys_pair_vec);

    m_redis_client.sync_commit();

    return true;
    }

    table::entitys_t table::get_entitys_by_primary_key_value(const std::string& primary_key_value){
    std::string id = get_id_by_primary_key_value(m_table_name + ":" + m_records[m_primary_key_index] + ":" + primary_key_value);

    if(id == ""){

    static entitys_t static_empty_entitys_vec;
    return static_empty_entitys_vec;
    LOG_ERROR << "no this entitys";

    }

    entitys_t vec;

    std::future reply = m_redis_client.hgetall(m_table_name + ":" + id);
    m_redis_client.sync_commit();

    std::vector v = reply.get().as_array();
    auto iter = v.begin();
    for(iter++; iter < v.end(); iter += 2){

    //LOG_DEBUG << (*iter).as_string();
    vec.emplace_back((*iter).as_string());

    }

    return std::move(vec);
    }

    int main()
    {
    table accounts_info;
    table::records_t records_vec = {"id", "accounts", "password", "nick_name"};
    accounts_info.create("sip:accounts_info", records_vec, "accounts");

    table::entitys_t entitys_vec0 = {"0", "ailu_0", "123", "sola_0"};
    accounts_info.insert(entitys_vec0);

    table::entitys_t entitys_vec1 = {"1", "ailu_1", "123", "sola_1"};
    accounts_info.insert(entitys_vec1);

    table::entitys_t entitys_vec2 = {"2", "ailu_2", "123", "sola_2"};
    accounts_info.insert(entitys_vec2);

    table::entitys_t entitys_vec3 = {"3", "ailu_3", "123", "sola_3"};
    accounts_info.insert(entitys_vec3);

    table::entitys_t ailu_1_accounts = accounts_info.get_entitys_by_primary_key_value("ailu_1");

    auto it = ailu_1_accounts.begin();
    while(it != ailu_1_accounts.end()){

    std::cout << *it << std::endl;
    it++;

    }

    getchar();
    return 0;
    }
    Alt text

    Alt text

    小结
    目前给出了redis增查简单设计方法,更新和删除也是通过redis的基本方法对应设计即可,这里不再详述。
    此外,可以看出redis的数据库设计还是比较灵活的,如何设计出最适合我们场景需求且高效的正是它难点所在。

    展开全文
  • 如何设计一个关系数据库 要设计一个关系数据库,首先要将其划分成两大部分,一个是存储部分,该部分类似一个文件系统,来将数据持久化到数据存储设备...1.为什么使用索引 咱们先对查询数据的方式做一个调研,...

    如何设计一个关系型数据库

    在这里插入图片描述
    要设计一个关系型数据库,首先要将其划分成两大部分,一个是存储部分,该部分类似一个文件系统,来将数据持久化到数据存储设备中。另一个是程序实例模块,来对存储进行逻辑上的管理,而程序实例部分将包含:存储管理模块、缓存机制模块、SQL解析模块、日志管理模块、权限划分模块、容灾机制模块、索引管理模块、锁管理模块。

    索引模块

    1.为什么要使用索引

    咱们先对查询数据的方式做一个调研,最简单方式对数据进行查询,那就是全表扫描,将整张表的数据全部或分批次记载到内存中,刚刚我们提到存储的最小单位是块或者列,他们是由多行数据组成的,我们将这些块都加载进来,逐个块去轮寻,找到我们要的目标并返回,这种方式普遍认为会比较慢的,当数据量少的时候适用,数据量大的时候不适用,因此很多情况下我们要避免全表扫描的发生,所以我们需要映入更高效的机制 索引,它的灵感来自字典,在字典中只要我们把一些关键信息组织起来,比如说偏旁部首这些,查询的时候依据这些指引,就能查询到我们想要的信息,很快便能查到我们要查的字了,这些关键信息和查找的方式便组成了我们的索引,通过索引来大幅度提升查询速度。

    2.什么样的信息能成为索引

    是能把该记录限定在一定查找范围内的字段就是关键信息。主键便是一个很好的切入点,当然其它唯一键以及普通键等都可以成为索引。

    展开全文
  • 这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储...而在设计表的时候,我们都会关注一个问题,使用什么存储引擎。等一下,存储引擎?什么是存储引擎? 什么是存储引擎? 关系数据库表是用于存储和组织信息

    这篇文章主要介绍了MySQL存储引擎总结,本文讲解了什么是存储引擎、MyISAM、InnoDB、MEMORY、MERGE等内容,需要的朋友可以参考下

    前言

    在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库。而在设计表的时候,我们都会关注一个问题,使用什么存储引擎。等一下,存储引擎?什么是存储引擎?

    什么是存储引擎?

    关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎,我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。这篇博文将总结和分析各个引擎的特点,以及适用场合,并不会纠结于更深层次的东西。我的学习方法是先学会用,懂得怎么用,再去知道到底是如何能用的。下面就对MySQL支持的存储引擎进行简单的介绍。

    MyISAM

    在mysql客户端中,使用以下命令可以查看MySQL支持的引擎。

    复制代码 代码如下:

    show engines;

    MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:

    1.tb_demo.frm,存储表定义;
    2.tb_demo.MYD,存储数据;
    3.tb_demo.MYI,存储索引。

    MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

    1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
    2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。

    InnoDB

    InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的MySQL 5.6.13版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

    1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
    2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
    3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
    4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
    5.支持自动增加列AUTO_INCREMENT属性。

    一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。

    MEMORY

    使用MySQL Memory存储引擎的出发点是速度。为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。获得速度的同时也带来了一些缺陷。它要求存储在Memory数据表里的数据使用的是长度不变的格式,这意味着不能使用BLOB和TEXT这样的长度可变的数据类型,VARCHAR是一种长度可变的类型,但因为它在MySQL内部当做长度固定不变的CHAR类型,所以可以使用。

    一般在以下几种情况下使用Memory存储引擎:

    1.目标数据较小,而且被非常频繁地访问。在内存中存放数据,所以会造成内存的使用,可以通过参数max_heap_table_size控制Memory表的大小,设置此参数,就可以限制Memory表的最大大小。

    2.如果数据是临时的,而且要求必须立即可用,那么就可以存放在内存表中。

    3.存储在Memory表中的数据如果突然丢失,不会对应用服务产生实质的负面影响。

    Memory同时支持散列索引和B树索引。B树索引的优于散列索引的是,可以使用部分查询和通配查询,也可以使用<、>和>=等操作符方便数据挖掘。散列索引进行“相等比较”非常快,但是对“范围比较”的速度就慢多了,因此散列索引值适合使用在=和<>的操作符中,不适合在<或>操作符中,也同样不适合用在order by子句中。

    可以在表创建时利用USING子句指定要使用的版本。例如:

    复制代码 代码如下:

    create table users
    (
        id smallint unsigned not null auto_increment,
        username varchar(15) not null,
        pwd varchar(15) not null,
        index using hash (username),
        primary key (id)
    )engine=memory;

    上述代码创建了一个表,在username字段上使用了HASH散列索引。下面的代码就创建一个表,使用BTREE索引。

    复制代码 代码如下:

    create table users
    (
        id smallint unsigned not null auto_increment,
        username varchar(15) not null,
        pwd varchar(15) not null,
        index using btree (username),
        primary key (id)
    )engine=memory;

    MERGE

    MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须完全相同,尽管其使用不如其它引擎突出,但是在某些情况下非常有用。说白了,Merge表就是几个相同MyISAM表的聚合器;Merge表中并没有数据,对Merge类型的表可以进行查询、更新、删除操作,这些操作实际上是对内部的MyISAM表进行操作。Merge存储引擎的使用场景。

    对于服务器日志这种信息,一般常用的存储策略是将数据分成很多表,每个名称与特定的时间端相关。例如:可以用12个相同的表来存储服务器日志数据,每个表用对应各个月份的名字来命名。当有必要基于所有12个日志表的数据来生成报表,这意味着需要编写并更新多表查询,以反映这些表中的信息。与其编写这些可能出现错误的查询,不如将这些表合并起来使用一条查询,之后再删除Merge表,而不影响原来的数据,删除Merge表只是删除Merge表的定义,对内部的表没有任何影响。

    ARCHIVE

    Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。

    存储引擎的一些问题

    1.如何查看服务器有哪些存储引擎可以使用?
    为确定你的MySQL服务器可以用哪些存储引擎,执行如下命令:

    复制代码 代码如下:

    show engines  \G;

    这个命令就能搞定了。


    2.如何选择合适的存储引擎?
        选择标准可以分为:
    (1)是否需要支持事务;
    (2)是否需要使用热备;
    (3)崩溃恢复:能否接受崩溃;
    (4)是否需要外键支持;
    然后按照标准,选择对应的存储引擎即可。

    总结

    这篇文章总结了几种比较常用的存储引擎,对于实际的工作,需要根据具体的情况而定,结合实际的项目实例进行应用,才是最好的学习方法。


    展开全文
  • 数据库什么使用视图

    千次阅读 2016-11-23 14:10:23
     数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。  例如:对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭住址等信息;而学生成绩表只存储了学生学号、科目、...

    使用视图大致有两个方面的原因:


    1.封装查询


           数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。

          关系------每个关系可以看成由行和列交叉组成的一个二维表格。

           一个关系对应一个二维表格。


          例如:对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭住址等信息;而学生成绩表只存储了学生学号、科目、成绩等信息。现需获得学生姓名及成绩信息,那么就需要创建一个关系,该关系需要包括学生姓名、科目、成绩。但为该关系创建一个新的数据表,并利用实际信息进行填充,以备查询使用,是不适宜的。因为这种做法很明显的造成了数据库中数据的大量冗( rǒng)余。

          视图则是解决该问题的最佳策略。因为视图可以存储查询定义(或者说关系运算),那么,一旦使用视图存储了查询定义,就如同存储了一个新的关系。用户可以直接对视图中所存储的关系进行各种操作,就如同面对的是真实的数据表。


    2.灵活的控制安全性



    展开全文
  • 而在设计表的时候,我们都会关注一个问题,使用什么存储引擎。等一下,存储引擎?什么是存储引擎? 什么是存储引擎? 关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel...
  • 另外,关系数据库仍然是许多人都青睐的持久信息存储方法,并且在较长时间内这种情况不太会改变。请继续读下去,了解如何使用这种技术。为什么要写有关对象-关系数据库之间的映射的文章呢?因为在对象范例和关系范例...
  • 每一个数据库都具有一个或多个API用以创建,访问,管理,检索和拷贝存储的数据信息。 如今大家用的大多数是关系数据库管理系统(RDBMS)来储存和管理大量数据。所谓关系数据库,就是以关系模型为基础的数据库,...
  • rqlite是一个轻量级的分布式关系数据库,它使用作为其存储引擎。 形成集群非常简单,可以很好地处理领导者选举,并容忍包括领导者在内的机器故障。 rqlite可用于Linux,macOS和Microsoft Windows。 查看。 为什么?...
  • 关系数据库基础

    2017-09-18 10:02:13
    1.1为什么使用数据库 所谓数据库,就是在计算机上集中存放数据的地方。通过将我们所需的数据和信息都保存在计算机数据库中,可以提供对数据的集中控制。数据库的集中控制有如下优点: @降低存储数据的冗余度 ...
  • SQL Server 2008数据库设计与实现(关系数据库实现的通关宝典) 基本信息 原书名: Pro SQL Server 2008 Relational Database Design and Implementation 原出版社: Apress 作者: (美)Louis Davidson Kevin Kline ...
  • 引入问题:如何设计一个关系数据库? 首先会有一个文件系统进行存储存储到机械硬盘或者固态硬盘上。 还有程序实例模块把数据的逻辑结构映射出物理结构,接下来细分程序模块 索引模块 几个常见问题: 为...
  • 文章目录一、为什么使用范式?二、什么是数据库三大范式?1、第一范式2、第二范式3、第三范式三、数据库设计一定要遵循三大范式吗?四、总结 一、为什么使用范式? 要想设计—个好的关系,必须使...目前关系数据库
  • 数据库

    2020-01-04 20:04:14
    DBA(数据库管理员),DBA的职责是什么 1.决定数据库中的信息内容和结构 2.决定数据库存储结构和存储策略 3.定义数据的安全性要求和完整性约束 4.监控数据库使用和运行 5.完成数据库的改进,重组,或重构 2...
  • 什么是NoSQL数据库

    2014-07-21 23:24:20
    它的意义是:适用关系数据库的时候就使用关系数据库,不适用的时候也没有必要非使用关系数据库不可,可以考虑使用更加合适的数据存储。 为弥补关系数据库的不足,各种各样的NoSQL数据库应运而生。 为了更...
  • sql为主干为什么我这样理解:...https://www.jb51.net/article/79236.htm 为什么使用NoSQL 这些nosql? 对java语言而言: redis:用于缓存 – 读速度极快(内存中) mongoDb – 读写事务都是均衡的.node.js开发的js
  • 1.什么是etcd服务 etcd是一个采用HTTP协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。用于共享配置和服务发现的分布式,一致性的KV存储系统.其很容易部署、安装和使用,提供了...
  • JCR库与RDBMS不同,因为JCR库:>是分层的,允许您在一个紧密匹配您的需求的结构中组织您的内容,相关信息通常存储在一起,从而...摘要信息真正存储在哪里:许多JCR实现可以将内容存储在各种关系数据库和其他存储...
  • 什么使用索引? 在搜索数据量较大的表,避免全表扫描,减少IO访问量。 什么样的信息能称为索引? 如唯一键或有一定区分度的数据字段 索引的数据结构 1、二叉查找树 删除或新增之后,容易退化,树的深度会很...
  • Mysql数据库学习大全

    2020-12-14 19:09:55
    1.2什么关系数据库关系数据库就是底层以二维表的形式保存数据的库就是关系数据库 保存学生信息(student表) 常见的关系数据库有哪些?(了解) SqlServer: 微软提供、适用于中型、大型的项目中,收费,在...
  • 数据库中,树型结构的存储方式,一般有三种,相邻表,路径关联,闭包表, 这三种方法无非解决两个问题, 1. 结点的信息存储 2. 明确结点之间的关系 同时又会导致查询和更新操作之间的对立,为什么这么说,简单介绍...
  • 1.封装查询数据库虽然可以存储海量数据,但是在数据表设计上却不可能为每种关系创建数据表。例如,对于学生表,存储了学生信息,学生的属性包括学号、姓名、年龄、家庭地址等信息;而学生成绩表只存储了学生学号、...
  • 什么样的信息能成为索引? 三.索引的数据结构? 关于锁 1.MyISAM和InnoDB关于锁方面的区别是什么? 2.数据库事务的四大特性 3.事务隔离级别以及各级别下的并发访问问题 4.InoDB可重复读隔离级别下如何避免幻读...
  • 存储过程使管理数据库、显示关于数据库及其用户信息的工作更为容易。存储过程是 SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储数据库内,可通过来自应用程序的调用来...
  • 数据库基本概念

    2019-10-03 21:53:44
    那为什么使用数据库存储和管理数据?为什么不提倡使用像Excel这样的电子数据表来存储和管理数据呢? 上图所示的电子表格中,记录了公司员工及部门主管的信息。在该电子表格中,可以对每一列数...
  • 数据库基础

    2019-01-14 15:24:01
    2 关系结构模型数据库使用二维表格来存储数据; 3 常见的数据库 Oracle DB2 SQL Server MySQL; 4 学会区分什么是表结构,什么是表记录。创建表时,需要指定表的列数,以及列名称,列类型等信息。而不用指定表格的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 494
精华内容 197
关键字:

关系数据库使用什么存储信息