iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
自我挑戰組

初級紅寶石魔法師心得分享。系列 第 12

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

  • 分享至 

  • xImage
  •  

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還是有讓人建立一點信心的時候。


上一篇
D-19. Git中的tag 、Git flow && Array Partition I
下一篇
D-17. Rspec 從零開始寫測試(一)
系列文
初級紅寶石魔法師心得分享。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言