D-18. SQL & NoSQL、SQL injection、primary key & foreign key

SQL && NoSQL

SQL

Structured Query Language:结构化查询语言。用於查询关联式资料库的语言。
不要误以爲pgSQL || mySQL == SQL, 前两者是以SQL为准则的资料库管理系统厂商,SQL本身已经是一种标准了,也是第四代的程序语言。最简单基础的说明便是SQL是查询资料库资料的语言。

DBMS资料库管理系统(英语:database management system)。
DBMS+DB的部分就为常见的一家家厂商pgmy等,所以在问该学pgSQL还是mySQL都其实是在问,该用哪一家SQL的厂商,当然各厂商之间,函式语法有一点差异及功能上各有优点。


NoSQL(Non-SQL)

维基百科,自由的百科全书。
是对不同於传统的关联式资料库的资料库管理系统的统称。
NoSQL就不是指程序语言或标准喔~

SQL系统的资料库长得会有点像。

ID name role IQ
01 大明 战士 120
02 小明 法师 120
03 小美 侦查 120

NoSQL以最常用的Key-Value Database来看则像。

(:key => 01_name, :value => 小明)
(:key => 02_role, :value => 法师)
(:key => 03_IQ, :value => 120)

或常常看到的.json档案。

也并不是说NoSQL的系统就不允许有关联性资料库,还是可以有,但是最大的不同点在於,NoSQL可以处理分散式的资料。

两者差异简单比较

SQL由於是关联性资料库,资料明显标准化,虽DBMS间有所差异,但是了解标准後,跳换使用不同DBMS也不会有太大不适应。
NoSQL能处理较零散的资料,牺牲了明显关联性,但提高弹性与效能,比较新的就是潮!

实话说,不是选SQLNoSQL,要为自己的专案选择适合的DB种类,SQL1986年成为美国国家标准学会的一项标准,只从这个时间点算也已经30年,用SQL的资料库大多有着资料一致性,关联性明确,安全性较高(比较级)的优点,Rails框架中Active Record也很明显较适合SQL(这句废话,基本query都是翻译成SQL),虽然我一直认为SQL是我的弱项,但如果只是查找一些资本资料或简单关联性,会大概20~30个SQL语法,可能各DBMS都可以去使用了。
CP值比较高

NoSQL由於目前没有明确标准语言,各厂商间的系统会有很大的差异,例如可能选择mongo再换Dynamo基本上是等於重新学另一种软件的使用方式(两者需要不同套件与函式)。

SQL会了,再选择一种NoSQL来练习,这样最潮

一样不会讲SQL教学与安装DBMS部分,但真的可以先从这两个网站开始上手,初期非常足够。
https://www.w3schools.com/sql/sql_distinct.asp
https://www.w3school.com.cn/index.html

不是会了Active Record Query就不用学SQL....


SQL面试题

1.NoSQL与传统DBMS差异?
前面所说的就是了。

2.SQL injection?
最简单的理解:攻击者可以对网站输入SQL语法让网站去操作,例如输入DROP TABLE table_nam....

通常有三种类型:
Authorization Bypass
Injecting SQL Sub-Statements into SQL Queries
Exploiting Stored Procedures。其中以Injecting SQL Sub-Statements into SQL Queries最为常见及需防范部分。

Rails中就有内建的防范措施,於Rails Guides就有专门的资料介绍。

https://guides.rubyonrails.org/security.html#sql-injection

Thanks to clever methods, this is hardly a problem in most Rails applications. However, this is a very devastating and common attack in web applications, so it is important to understand the problem.

另外开头也示范了三种攻击方式的原理,例如解决Authorization Bypass

可以看到Authorization Bypass示范中,在我们查找用户帐号密码的query如果是写这样。

User.first("login = '#{params[:name]}' AND password = '#{params[:password]}'")

如果攻击者输入'OR '1'='1 作为名称,并输入'OR '2'>'1 作为密码,则会生成下面的SQL语法

SELECT * FROM users WHERE login = '' OR '1'='1' AND password = '' OR '2'>'1' LIMIT 1

利用到了OR把原本要输入的资料,变成1=12>1成为条件之一,两个都是true选项。

Rails的对策便是有内置的SQL字符过滤功能,可以把'"NULL或换行转译,其实用findfind_by都会有这功能,但在其中有where这类查询语法时,还是需手动操作,让用户输入受检查过的资料而不是让用户直接输入例如:

以下是在我们自己的Query该怎麽写。
正确的

Model.where("login = ? AND password = ?", entered_user_name, entered_password)

错误的

Model.where("login = #{user_name} AND password = #{password}"

3.primary key & foreign key ?

primary key常翻译主要索引条件(键),常有解释是资料表上某一栏位的值,但重点是这些值是要在整张资料表上唯一的,例如我上面画得很丑的这个。

ID name role IQ s_id
01 大明 战士 120 001
02 小明 法师 120 002
03 小美 侦查 120 003

当中只有ids_id适合当作primary keyid又比s_id适合,毕竟id是内建,即使删除资料後新建,惯例上不会用旧的id,会继续顺延用下去,例如上图现在把01删掉,新建的只会是04

foreign key常翻外部索引外部索引条件(键),主要是利用建立两张资料相关连的部分,当一个资料表的primary key被另一个资料可进行参考时,两者便会建立连结(具有关联性),而被参考的primary key资料也成为foreign key


今天的leetCode1929. Concatenation of Array

怎麽突然跳到1000多题?因为我今天好奇acceptance(验收过的)这个百分比是啥意思,比较多人验收,应该比较热门。结果最高是这题。
然後果然解起来很开心!!!
题目连结:https://leetcode.com/problems/concatenation-of-array/
题目重点:Ruby果然神简洁!

def get_concatenation(nums)
  nums+nums
end

解完,开心。

再来开心一题好了 XD!!!!(偶尔放松一下!!)
leetCode1480. Running Sum of 1d Array
题目连结:https://leetcode.com/problems/running-sum-of-1d-array/
题目重点:用each_with_index,还有nums[index] =超方便。

# @param {Integer[]} nums
# @return {Integer[]}
def running_sum(nums)

end

p running_sum([1,2,3,4]) #=> [1,3,6,10]
p running_sum([1,1,1,1,1]) #=> [1,2,3,4,5]
p running_sum([3,1,2,10,1]) #=> [3,4,6,16,17]

看例子一的示范
Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].

[1, 1+2, 1+2+3, 1+2+3+4]  == [1, 1+2, 3+3, 6+4]

Ruby学员起手式,自定义Arraysum方法。

  def sum(array)
    sum = 0
    array.each {|num| sum += num}
    sum
  end

现在还缺指定array内每一个值等於当下的sum

def running_sum(nums)
  sum = 0
  nums.each_with_index do |num, index|
    nums[index] = num + sum
    sum += num
  end
end

收工,开心!!


今天提到的
1.NoSQL与传统DBMS差异?
2.SQL injection?
3.primary key & foreign key?
4.leetcode还是有让人建立一点信心的时候。


<<:  Day 12 Azure cognitive service: OCR- 光学字元辨识

>>:  DAY7 浅扒网路 - 估计被扒皮的是我不是网路

Day04 - 学习 Vue CLI package.json 设定档

今天回到大神的教学 重新认识 Vue.js | Kuro Hsu 3-3 Vue CLI 环境设定与...

Day8 Vue Computed vs Method

我们在模板中要进行计算或转换资料时computed及method通常能做到一样的效果,这麽说的话那不...

【DAY 12】简单化、视觉化组织团队工作 - Planner

哈罗大家好~ 关於 SharePoint 功能其实还可以再说个五天八夜(?),但我想在善用云端工具提...

EP15 - [TDD] 建立 Order 参数 (1/2)

Youtube 频道:https://www.youtube.com/c/kaochenlong ...

Day18 将电脑接上印表机,将程序码或文章包装成书吧

今天来玩玩新的 CC: Tweaked 方块:Printer 跟 Disk Drive 一样,放置在...