我們從"ChatGPT會不會寫MySQL指令?"、以及"Power Up Your MySQL Queries: How ChatGPT Can Help You Retrieve MySQL Data"知道,確實ChatGPT能夠寫MySQL指令,而且ChatGPT可以當成DBA (DataBase Administrator) 助理來協助抓取需要的資料。
我們首先使用ChatGPT來協助我們學習資料庫技能,後續再來使用更多的人工智慧工具。
但是我們一直強調「協助」,而非讓ChatGPT全權處理,是因為ChatGPT的精準度有時還是會爆走,不能完全相信。
例如我說 : 「從選課系統中抓出修課代號為"1000"的學生姓名,請寫出MySQL指令。」
ChatGPT得到 : 「SELECT student_name FROM students WHERE course_code = '1000';」
如下圖 :
例如我再說 : 「從選課系統中抓出修課課程名稱為"資料庫管理"的學生姓名,請寫出MySQL指令。」
ChatGPT得到 : 「SELECT student_name FROM students WHERE course_name = '資料庫管理';」
如下圖 :
這兩個問題乍看很類似,所以ChatGPT給的兩個答案 :
「SELECT student_name FROM students WHERE course_code = '1000';」
「SELECT student_name FROM students WHERE course_name = '資料庫管理';」
在ChatGPT的假設下,有一個students資料表,其中包含"student_id"、"student_name"、"course_code"和"course_name"等欄位,其中"course_name"是代表課程名稱的欄位,"course_code"是代表修課代號的欄位,以上的答案是正確的。
但是正常的設計中並不會這樣設計,因為學生資料表不會有"course_code"和"course_name"欄位。
那麼正常應該如何呢?
我們再詢問ChatGPT一次 : 「請問,我要設計一個網路選課系統,應該至少要有那些MySQL資料表?」
ChatGPT說 : 「可能需要的資料表:
學生資料表:存儲學生的基本資料,例如學號、姓名、性別、生日等。
課程資料表:存儲所有的課程資訊,例如課程代號、課程名稱、授課老師、課程時間、課程地點等。
課程選修表:存儲學生選修的課程資訊,例如學生選修的課程代號、修課時間、修課狀態等。
課程評價表:存儲學生對課程的評價,例如評價星級、評價內容等。
排課資料表:存儲課程的排課資訊,例如課程時間、課程地點等。
系統管理員資料表:存儲系統管理員的基本資料,例如帳號、密碼等。」
如下圖 :
如果網路選課系統的資料表如上,ChatGPT的回答就變成 :
SELECT students.name FROM students INNER JOIN course_selections ON students.student_id = course_selections.student_id WHERE course_selections.course_code = '1000';
如下圖 :
這樣就對了 !!
可見,ChatGPT剛開始會先給你在他假設下的答案,但是如果你先引誘他先有正確的假設,ChatGPT就會給你正確的答案。你問了笨問題,他先給你懶惰的答案,但是當你精明起來,他就只能照著你的邏輯來給答案。
因此,要利用ChatGPT等人工智慧工具,深入學習資料庫技能,你必須從對話中修正你的邏輯。剛開始你可能不懂什麼是MySQL或是什麼是關聯式資料庫,但是從對話中你自己也必須學習與反思,然後再讓ChatGPT給你更好的答案。
以下我們來演練一下。
我說 : 「學習資料庫 最好學哪種資料庫開始?」
ChatGPT說 : 「學習資料庫,首先需要選擇一種主流的資料庫系統來學習。以下列出幾個主流的資料庫系統,以及它們的特點和使用情況:
MySQL: MySQL是一種開源的關聯式資料庫管理系統。它是目前世界上使用最廣泛的開源資料庫之一,由於它具有安裝方便、穩定性高、開源免費等優點,因此被廣泛使用。如果你想要學習關聯式資料庫,那麼MySQL是一個很好的開始。
PostgreSQL:PostgreSQL是一個功能強大、可擴展、免費的關聯式資料庫管理系統。它提供了高級的資料庫特性,例如:觸發器、索引、事務、視圖等。如果你對於高級的資料庫特性感興趣,那麼PostgreSQL是一個很好的選擇。
Microsoft SQL Server: Microsoft SQL Server是一個商業級關聯式資料庫管理系統,它專門為微軟的Windows操作系統設計。如果你是一個微軟技術的愛好者,那麼Microsoft SQL Server是一個很好的選擇。
Oracle:Oracle是一種商業級的關聯式資料庫管理系統。它擁有許多高級特性,例如:分區、分散式資料庫等。如果你對於商業級資料庫有興趣,那麼Oracle是一個很好的選擇。
綜上所述,如果你是初學者,可以先從MySQL開始學習,因為它易於學習和使用,並且有豐富的學習資源。如果你對高級特性感興趣,可以考慮學習PostgreSQL、Microsoft SQL Server或Oracle等資料庫系統。無論你選擇哪種資料庫系統,要記得先掌握關聯式資料庫的基本概念和SQL語言。 」
PostgreSQL : https://www.postgresql.org/
Oracle : https://www.oracle.com/tw/
Microsoft SQL Server : https://www.microsoft.com/zh-tw/sql-server/
如下圖 :
我說 : 「觸發器、索引、事務、視圖等是什麼? 英文是?」
ChatGPT說 : 「以下是觸發器、索引、事務、視圖等的英文名稱: 觸發器 (Trigger) 索引 (Index) 事務 (Transaction) 視圖 (View)」
我說 : 「這些在MYSQL也有吧?」
ChatGPT說 : 「是的,這些功能在 MySQL 中都有支援」
如下圖 :
我說 : 「MySQL跟PostgreSQL有何差別?」
ChatGPT說 : 「MySQL和PostgreSQL都是流行的關聯式資料庫管理系統,它們在一些方面有些不同。以下是一些MySQL和PostgreSQL之間的主要差異:
開源許可證:MySQL使用的是雙授權模式,其中一個許可是GPL(GNU通用公共許可證),另一個是商業許可。而PostgreSQL使用的是一個簡單的、非常寬鬆的開源許可證,稱為PostgreSQL許可證。
數據類型:MySQL和PostgreSQL在數據類型方面有所不同。例如,PostgreSQL支援陣列和JSON數據類型,而MySQL則不支援。MySQL的數據類型支援更多的數值類型和時間日期格式。
索引:PostgreSQL提供了更多的索引選項,例如部分索引、函數索引和GIST索引等,可以提高數據庫的查詢效率。MySQL在索引方面較為簡單。
適用場景:MySQL通常用於中小型應用程序,例如網站、博客、論壇等,而PostgreSQL通常用於較大的企業級應用程序,例如金融、保險和電信等。
集群:MySQL的集群解決方案基於主-從(master-slave)架構,可以實現備份、讀寫分離等功能。而PostgreSQL的集群解決方案基於分布式架構,可以實現數據分片、高可用性和可擴展性等功能。
總的來說,MySQL和PostgreSQL都是優秀的關聯式資料庫管理系統,適用於不同的場景。使用哪一個系統,取決於你的需求和應用程序的特點。」
如下圖 :
當然,你應該做的不是全盤接受ChatGPT的說法,你應該去確認。
例如「開源許可證」,MySQL是雙授權模式 (dual license model),這是正確的,一方面MySQL是免費的GPL授權,另一方面是收費的商業授權。如果要使用免費的MySQL在商業用途上,你的系統也必須遵循GPL,也就是免費開源,如果不想免費開源就要付費。而PostgreSQL就是MIT license,就是免費的。
那麼使用MySQL在公司上開發系統就可能會出問題,因此另外的解方就是使用MariaDB,他其實就是免費的MySQL。不知道為何ChatGPT只講MySQL,沒有提到MariaDB。
MariaDB : https://mariadb.org/
而以上ChatGPT的說明,好像PostgreSQL比較適合用在分散式以及大型的資料庫,那麼我們可以再研究一下,MySQL或是MariaDB,難道不能用在分散式以及大型的資料庫嗎?
我們先問一下 : 「MySQL或是MariaDB,難道不能用在分散式以及大型的資料庫嗎?」
ChatGPT說 : 「MySQL和MariaDB都可以用在分散式和大型的資料庫中,但在處理大量且複雜的資料時,可能需要額外的資源和優化才能達到最佳效能。這些資源和優化包括:
複製:將資料複製到多個伺服器上,以提高可用性和可擴展性。
分區:將資料分割成多個區域,以便更好地管理和查詢資料。
索引:使用適當的索引來加速查詢。
快取:使用快取技術減少對資料庫的讀取操作,提高效能。
分散式架構:將資料庫分散到多個伺服器上,以實現更高的可擴展性和可用性。
儲存引擎:選擇適合你的資料庫架構和需求的儲存引擎。
總之,MySQL和MariaDB都是強大的資料庫管理系統,可以處理大型和分散式的資料庫,但在處理大量複雜的資料時,需要特別注意優化和配置。」
如下圖 :
我再問 : 「分散式資料庫是什麼? MySQL可以是分散式資料庫嗎?」
ChatGPT說 : 「分散式資料庫是指將資料分散儲存在多個地理位置不同的資料庫中,以達到提高可用性、可擴展性和容錯能力的目的。這些資料庫之間可以實現數據同步和共享,通常需要一個中央化的管理系統來協調不同資料庫之間的數據流動。
MySQL是一種關聯式資料庫管理系統(RDBMS),並不是一個原生的分散式資料庫,但是MySQL可以通過設置主從複製或者分區表等方式實現分散式的部署。主從複製是指在多個MySQL資料庫之間設置主從關係,主資料庫上的修改操作會自動同步到所有從資料庫上。分區表是指將單個表格的數據分散儲存在多個MySQL資料庫上,並在需要時進行數據合併操作。
總之,MySQL可以通過特定的配置和功能實現一定程度的分散式部署,但是在真正需要高可用性、可擴展性和容錯能力時,可能需要使用更為專業的分散式資料庫系統,例如Apache Cassandra、MongoDB等。」
如下圖 :
我再問 : 「分散式資料庫是什麼? MySQL可以是分散式資料庫嗎?」
ChatGPT說 : 「是的,Apache Cassandra、MongoDB等分散式資料庫通常被歸類為NoSQL資料庫,這是因為它們不使用傳統的關聯式資料模型,而是採用非結構化或半結構化的資料模型。這使得NoSQL資料庫可以更容易地擴展和分散化,因為不需要像傳統的關聯式資料庫一樣強制性地維護表格之間的關係。
另外,NoSQL資料庫還通常具有以下特點,這些特點也使它們更適合用作分散式資料庫:
水平擴展性:NoSQL資料庫通常可以更輕鬆地實現水平擴展,即將數據分散儲存在多個節點中,而不是集中儲存在單個節點中。
高可用性:NoSQL資料庫通常支持自動故障轉移和恢復,即在某些節點失效時,系統可以自動地將數據轉移至其他節點。
靈活性:NoSQL資料庫通常支持更靈活的數據模型和較為寬鬆的數據結構,這使得開發人員可以更容易地將系統設計為分散式架構。
總之,NoSQL資料庫的特點使其更適合用作分散式資料庫,但在選擇資料庫時還需根據具體需求進行評估和比較。」
如下圖 :
我再問 : 「水平擴展性 可否給我例子?」
ChatGPT說 : 「水平擴展性是指將資料庫中的數據分散儲存在多個節點中,而不是集中儲存在單個節點中。這樣可以實現更好的可擴展性和容錯能力,並且可以更有效地處理大量數據。
以下是幾個常見的實現水平擴展性的例子:
分區表(Partitioning):將資料表中的數據按照某個特定的方式分區儲存在不同的節點上,例如按照使用者ID、地理位置等分區。這樣可以實現較好的負載均衡,使得每個節點上的數據量相對較小,並且可以更好地處理高併發的數據請求。
主從複製(Master-slave replication):將資料庫中的數據同步複製到多個節點上,通常其中一個節點為主節點(Master),其他節點為從節點(Slave)。當主節點發生故障時,系統可以自動地將一個從節點升級為主節點,以保證系統的正常運行。
分佈式資料庫(Distributed database):將數據庫中的數據分散儲存在多個節點上,並且每個節點都可以獨立地執行數據庫操作,例如查詢、更新等。這樣可以實現更好的可擴展性和容錯能力,但同時也需要更高的系統管理和維護成本。
總之,這些例子都是實現水平擴展性的常用方式,並且在實際應用中,還可以根據具體需求選擇不同的方式進行應用。」
如下圖 :
我再問 : 「水平擴展性英文是? 為何稱為水平擴展性? 還有垂直擴展性嗎?」
ChatGPT說 : 「水平擴展性的英文為"Horizontal scalability"。
水平擴展性的概念是基於資料庫中的數據分區和分散式儲存的概念,將資料庫中的數據分散到多個節點上進行儲存和處理,以實現更好的可擴展性和容錯能力。稱為"水平"是因為增加更多的節點可以水平擴展系統的性能,即增加更多的節點可以擴展系統的能力,而不是垂直增加單個節點的資源。
相對應的,垂直擴展性的英文為"Vertical scalability"。垂直擴展性是指在單個節點上增加更多的資源(如CPU、內存、磁盤等)來擴展系統的能力。垂直擴展性通常會受到單個節點資源的限制,而且成本也相對較高。」
如下圖 :
我再問 : 「儲存引擎是什麼? 優化和配置又需要做什麼?」
ChatGPT說 : 「儲存引擎是資料庫系統中用來管理資料儲存和檢索的核心元件。每個儲存引擎都有自己獨特的特點和優缺點,可以根據不同的需求選擇合適的儲存引擎來提高資料庫系統的效率和性能。在優化和配置MySQL或MariaDB等資料庫系統時,需要注意以下幾個方面:
選擇適當的儲存引擎:如MyISAM、InnoDB等。選擇適當的儲存引擎可以提高資料庫系統的效率和性能。
優化SQL查詢:優化SQL查詢可以使資料庫系統更快地檢索和回應資料。
使用索引:使用索引可以加速資料檢索和查詢,提高資料庫系統的效率。
設置緩存:設置緩存可以減少資料庫系統對磁碟的讀寫操作,提高系統的效率。
設置參數:設置參數可以調整資料庫系統的性能和效率,如緩衝池大小、最大連接數等。
監控系統:監控系統可以幫助管理員察覺資料庫系統中的問題和瓶頸,及時做出調整和優化。
綜合以上幾點,優化和配置MySQL或MariaDB等資料庫系統可以提高系統的效率和性能,並且更好地適應分散式和大型的資料庫需求。」
如下圖 :
我再問 : 「這些優化和配置,PostgreSQL也需要吧?」
ChatGPT說 : 「是的,PostgreSQL 也需要進行優化和配置。儘管 PostgreSQL 和 MySQL 在一些方面有所不同,但許多基本的優化和配置策略也可以應用於兩種資料庫系統。例如,優化 SQL 查詢、監視系統資源使用、調整緩存和記憶體使用、優化索引和分區、優化表結構等等,這些都是 PostgreSQL 和 MySQL 都需要考慮的因素。當然,因為 PostgreSQL 和 MySQL 具有不同的優點和特點,所以在進行優化和配置時,也需要根據具體情況進行調整。」
如下圖 :
我再問 : 「什麼是關聯式資料庫? 有不是關聯式資料庫嗎? 有哪些?」
ChatGPT說 : 「關聯式資料庫(Relational Database)是一種以表格(Table)為基礎的資料庫系統,它通過使用關聯(Relation)的概念將數據分為不同的表格,並使用這些表格之間的關聯進行查詢和操作。 每個表格代表一種實體或概念,而表格中的每一行則代表一個具體的實例或對應的資料。每一列則代表一個屬性或欄位,用來描述對應資料的特徵或特性。關聯式資料庫可以通過SQL(Structured Query Language)語言進行操作和查詢。 除了關聯式資料庫,還有一些其他的非關聯式資料庫系統,例如:
鍵值對(Key-Value)資料庫:它以鍵值對的形式儲存資料,使用鍵來查詢和操作資料,例如Redis和Amazon DynamoDB。
文件(Document)資料庫:它以文件(Document)的形式儲存資料,可以使用JSON或XML等格式來描述資料,例如MongoDB和Couchbase。
列(Column)資料庫:它以列的形式儲存資料,每一列都包含多個屬性或欄位,例如Apache HBase。
圖(Graph)資料庫:它以圖(Graph)的形式儲存資料,將資料和它們之間的關係表示為圖形結構,例如Neo4j和Amazon Neptune。」
如下圖 :
我再問 : 「如果要學習非關聯式資料庫,我應該從哪個開始學習?」
ChatGPT說 : 「學習非關聯式資料庫,你可以從以下幾個方向開始學習:
鍵值對型資料庫(Key-Value Store):鍵值對型資料庫是最簡單的非關聯式資料庫,它將每一筆資料都視為一個鍵值對,每個鍵都對應一個值,值可以是任何格式,例如字串、數字、JSON 等。學習鍵值對型資料庫可以從 Redis、Memcached 等開始。
文件型資料庫(Document Store):文件型資料庫是以文件為基礎的資料庫,它將所有相關的資料都儲存在一個文件中,而每個文件又可以包含不同的欄位,並且每個欄位都可以是任何格式。學習文件型資料庫可以從 MongoDB、Couchbase 等開始。
列族型資料庫(Column-Family Store):列族型資料庫是一種將資料儲存在列族中的資料庫,每個列族都包含一個或多個欄族,而每個欄族又包含一個或多個列。這種資料庫適合於儲存大量結構相同的資料。學習列族型資料庫可以從 Apache HBase、Apache Cassandra 等開始。
圖形型資料庫(Graph Database):圖形型資料庫是一種針對圖形結構的資料庫,它使用圖形來描述資料之間的關係,每個節點表示一個實體,每個邊表示兩個實體之間的關係。學習圖形型資料庫可以從 Neo4j、ArangoDB 等開始。
以上只是非關聯式資料庫的一些基本類型,實際上還有很多其他的非關聯式資料庫,你可以根據自己的需求和興趣選擇適合自己的學習方向。」
如下圖 :
我再問 : 「Redis與MongoDB哪個較容易學習?」
ChatGPT說 : 「這兩個資料庫的設計理念和使用方式都有一定的不同,且用途也不完全相同。因此,要決定哪個資料庫較容易學習,還需要看個人的背景和學習目的。如果你已經熟悉了關聯式資料庫的概念,並且需要使用一個可以快速存取資料、較簡單易懂且性能優良的資料庫,那麼Redis可能較適合你。而如果你需要儲存大量的非結構化資料(例如文件、影像和音頻等),並需要進行複雜的查詢和分析操作,那麼MongoDB可能更適合你。總體而言,Redis和MongoDB都有較為詳盡的官方文件和社區支援,且都有許多免費的學習資源和教程可供參考。因此,只要有一定的資料庫基礎,學習這兩種資料庫都不會太困難。」
MongoDB : https://www.mongodb.com/
Redis : https://redis.io/
如下圖 :
我再問 : 「Facebook跟Twitter使用哪種資料庫?」
ChatGPT說 : 「Facebook使用的是自己開發的分布式資料庫管理系統Apache Cassandra。Twitter則曾經使用MySQL,但目前已轉向使用分散式資料庫管理系統Apache HBase。」
如下圖 :
到此我們還需要再做功課,去證實幾件事情 :
(1) 學習非關聯式資料庫,應該從哪裡開始?
從這篇"Why Your MongoDB needs Redis"來看,似乎MongoDB跟Redis並不是互斥,是可以搭配使用,兩者都是屬於NoSQL類型的資料庫。所以如果要學習非關聯式資料庫,兩個都需要了解一下。
(2) 臉書及推特使用的資料庫是什麼?
我從臉書的應徵工作需求上,看到以下的需求 :
再根據其他人的說法,臉書已經不再重度使用Apache Cassandra,表示已經使用其他資料庫,如下 :
所以顯然ChatGPT給了錯誤的資訊,再根據這篇"Facebook database [Updated] – A thorough insight into the databases used @Facebook",說到臉書使用的資料庫主要是MySQL (InnoDB資料庫引擎),處理大數據的部分使用Apache Hadoop, HBase, Hive, Apache Thrift and PrestoDB,Apache Cassandra則是用在inbox search。
暫時還不能確定這個資訊的正確性,這個部分後續再來尋找更多資訊。
[附記]
ChatGPT好用的工具 :
ChatGPT Prompt Genius 這個工具是Google Chrome的外掛,可以把聊天的內容直接匯出為PDF或是PNG。
ChatGPT for Google 這個工具會在Google搜尋時,同時顯示ChatGPT的聊天內容。
0 留言