通過與運算處理一對多關係
阿新 • • 發佈:2021-07-09
背景
以下是通過TIOBE查詢的2017年8月TOP10程式語言的排行情況:
排行 | 語言 |
---|---|
1 | Java |
2 | C |
3 | C++ |
4 | C# |
5 | Python |
6 | Visual Basic .NET |
7 | PHP |
8 | JavaScript |
9 | Perl |
10 | Ruby |
假設程式猿A掌握了的C語言、PHP和JavaScript等技術,要儲存猿A、猿A與技術之間的關係,我能想到的有兩個方式:
方式一:程式猿表+語言表+關係表
程式猿表(programmer)
id | name |
---|---|
1 | A |
語言表(language)
id | name |
---|---|
1 | Java |
2 | C |
3 | C++ |
.
.
.
省略
關係表(programmer_language)
id | programmer_id | language_id |
---|---|---|
1 | 1 | 2 |
2 | 1 | 7 |
3 | 1 | 8 |
這種方式是很常見的一種方式。程式猿表和語言表通過關係表「一對多」的關聯起來。通過三表聯查查出程式猿擁有哪些技術。假如需要查出掌握PHP的程式猿時候,需要三表聯查:
select \* from programmer_language r left join language l on r.language_id = l.id left join programmer p on r.programmer_id = p.id where l.id = 7
方式二:程式猿表+語言表
語言表
排行 | 語言 | 2^數值 |
---|---|---|
1 | Java | 1 |
2 | C | 2 |
3 | C++ | 4 |
4 | C# | 8 |
5 | Python | 16 |
6 | Visual Basic .NET | 32 |
7 | PHP | 64 |
8 | JavaScript | 128 |
9 | Perl | 256 |
10 | Ruby | 512 |
加入一列數值欄位,數值為2^(id-1)。
程式猿表(programmer)
id | name | language_id |
---|---|---|
1 | A | 194 |
表中language_id值為是194,這個194代表什麼呢?
194 = 2(C語言) + 64(PHP) + 128(JavaScript),依舊懵逼中。。。
先來看看此時查詢掌握了PHP的程式設計師的SQL:
select \* from programmer where 64 & language_id = 64
是不是非常簡單了!
下面來看這條SQL中的where部分:
64 & language_id = 64
相當於64和資料庫中的194的一個與運算,首先轉換成二進位制數:
二進位制 十進位制
01000000 64
&
11000010 194
||
01000000 64
算出來的結果是64,即64(PHP)「存在」於194中。
如果要看猿A是否掌握了C#(32)的程式猿:
二進位制 十進位制
00100000 32
&
11000010 194
||
00000000 0
算出來的結果是0,即32(C#)「不存在」於194中。
與運算的計算方式
194是如何計算的呢?常規的方法是通過二進位制數「&」計算出。當然,也可以另類的通過十進位制數相加計算出,結果是一樣的,即:
194 = 2(C語言) + 64(PHP) + 128(JavaScript)
2^?的侷限
32位和64位的區別還涉及了記憶體的定址方面,32位系統的最大定址空間是2 的32次方= 4294967296(bit)= 4(GB)左右,而64位系統的最大定址空間的定址空間則達到了2的64次方= 4294967296(bit)的32次方=數值大於1億GB。換而言之,就是說32位系統的處理器最大隻支援到4G記憶體,而64位系統最大支援的記憶體高達億位數。