关系数据库(设计架构和编写查询)

来源: https : //en.wikipedia.org/wiki/Database#/media/File : Database_models.jpg

嗨伙计 !! 在本文中,我将讨论如何设计快速的关系数据库架构以及如何在关系数据库中编写原始sql查询。 因此,不浪费时间就让我们开始吧。

在研究设计模式之前,让我们先看一下构成一个好的Database的属性。 ACID db中事务的属性。

  1. 托米奇:每个事务被视为一个单一的单元,它要么成功完全,或完全失效。
  2. Çonsistent:DB是之前和交易后一致。
  3. 我这样想 :事务独立发生而没有干扰。 表示同时读取和写入多个表。
  4. d urability:死机耐用,具有容错功能。 意味着一旦事务被提交,即使在系统故障的情况下也将保持提交。

设计数据库架构

注意:我已经假设您已经选择选择关系数据库(如sql,postgres等)作为应用程序的主要信息来源。 您也可以混合和匹配(这几乎是每个应用程序的典型情况),但这超出了本文的范围。 我还假设您对数据库中的键和索引有一定的了解。(否则,请不要在注释部分写任何有关它的信息)。

数据库模式是代表整个数据库的逻辑视图的框架结构。 它可以简单地称为描述数据库中对象与信息之间关系的元数据。

为了开发良好的Relational DB模式,您只需要了解2件事。

1.实体之间的关系类型

2。 DB中的规范化(1NF,2NF,3NF)

关系类型:

实体之间的关系类型将告诉您需要在数据库中建立的表的数量。 一个数据库可以有多个表。 一般而言,有三种类型的关系。 让我们仔细看看-

一对一

A.在一对一关系中,表中的一个记录/行与一个表关联,而另一表中只有一个记录/行。

B.两个表将具有相同的主键,该主键将用于标识记录/行。 通过对此主键执行联接,我们将从两个表中获取完整的数据。

C.示例:用户表(将其分为用户的主要详细信息和次要详细信息)

表1 :(主要信息):User_ID(主键),名字,姓氏

表2 :(辅助信息):User_ID(主键),地址,电子邮件,联系人等。

注意:您可以争论只用一个主键将所有数据放在同一个表中,但是请相信我,这将不是一个有百万个值的有效且好的数据库设计。

一对多

答:在一对多关系中,表A中的每个记录可能在表B中具有许多链接的记录/行,但是表B中的每个记录/行可能在表A中只有一个对应的记录/行。

B.为了获取数据,只需将表1的主键作为第二个表的外键。 您需要最少2张表才能设计良好的一对多关系。

C.示例:存储所有政党候选人的信息。 在这种情况下,许多候选人属于同一个政党。 他们不能同时代表多个政党。

表1 :(政党信息):policy_Party_ID(主键),Party_Name,policy_Party_Head

表2 :(参与者候选者信息):Candidate_ID(主密钥),Candidate_Name,Policy_Party_ID(作为表1的参考的外部密钥)

多对多

答:当一个表中的多个记录与另一个表中的多个记录相关联时,就会发生多对多关系。

B.关系数据库系统通常不允许您在两个表之间实现直接的多对多关系。 因此,您需要为此关系创建第三个表。 这是几乎在每个应用程序中都会看到的最常见的关系。 第三表称为链接表或联结表。 您可以直接在第三张表上查询,以获取用于分析目的的数据。

C.示例:学生在高中就读了不同的课程。 许多/多名学生可以注册许多/多名课程,并且多个/许多学生可以选择许多/多名课程。

表1 :(学生信息):Student_ID(主键),Student_Name等。

表2 :(课程表):Course_ID(主键),Course_Name,Cost等。

表3 :(注册表):[Student_ID(从学生信息中获取参考的外键),Course_ID(从课程表中获取参考的外键)] — {复合键},Enrollment_ID等。

注意:在这里,表3将具有一个组合键,该组合键是表1和表2中外键的混合,并且此组合键将用作此结点/链接表的主键。

ñormalization

这是最小化DB中某个关系或一组关系的冗余的过程。

1 NF —必须有一个唯一标识记录/行的键。 这通常是主键或复合键。 (主键的概念)

2 NF —应该在1 NF中,并且每个非键列都应完全取决于主键。 (外键的概念)

3 NF —应该在2-NF中,并且Non key列彼此独立。 如果它们确实依赖,那么您可能必须拆分表。

编写原始SQL查询

让我们看一下查询数据库的一些基本模式。 请记住-查询结果始终是一个table。

模式1

SELECT * FROM TABLE_NAME 条件/限制:在这里,*表示所有列和条件都可用于匹配数据库行中的值。 *可以更改为从表获取所需的列值。

例如:USER_ID = 1的用户从SELECT FIRST_NAME,LAST_NAME

例如:从购买日期的USERS_TABLE中选择COUNT(*)> 12–12–2018和<12–1–2019

例如:从USERS_TABLE的SELECT NAME中选择NOT(年龄= 20)和NOT(FIRST_NAME ='KARAN')

例如:插入USERS_TABLE值('KARAN','JAG​​OTA')

您可以在此模式中使用其他一些功能/子句。 它包括-极限值偏移值或按col_name分组或按column_name desc或count(*)作为总数或具有col_name =值(发生在'WHERE'之后,而group_by或order_by在'WHERE'之前完成)。

模式2

SELECT OBJECT_OF_TABLE_1.COL,OBJECT_OF_TABLE_2.COL FROM TABLE_1 JOIN TABLE_2 ON OBJECT_OF_TABLE_1.COMMON_KEY = OBJECT_OF_TABLE_2.COMMON_KEY

在这里,您为两个表都创建一个对象(使用任何变量名,例如-我在用户和订单表的示例中使用U和P),选择所需的列名并将其联接(内部联接/左联接) / right联接)通过它们的公用键(一个表的主键和另一表的外键)上的表名

例如:SELECT U.FIRST_NAME,从U.CUSTOMER_ID上的USERS_TABLE JOIN ORDERS_TABLE购买P.CUSTOMER_ID

模式3

从(子查询 )作为别名选择AVG(*)

在这里,您只是在查询中编写查询。众所周知,查询结果本身就是一个表,它可用于进一步查询并查找所需的结果/数据。

希望您喜欢我的帖子。 请拍一下! 如果您不熟悉编程,还可以通过单击下面的链接,查看我关于pythonic的做事方式和JavaScript Essentials的文章。

不要忘记鼓掌,分享和关注。

From: https://hackernoon.com/relational-databases-designing-schema-writing-a-query-8e714fce689d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值