通过与运算处理一对多关系

背景

以下是通过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位系统最大支持的内存高达亿位数。

引用自百度经验

posted @ 2021-07-09 15:50  luyuqiang  阅读(59)  评论(0编辑  收藏  举报