注意:這是一個學習練習,用于學習如何實作類似 SQL 的關系資料庫。這只是整個宏偉愿景中的一小部分問題。
我有以下查詢,給定一個包含幾百條記錄的測驗資料庫:
select distinct "companies"."name"
from "companies"
inner join "projects" on "projects"."company_id" = "companies"."id"
inner join "posts" on "posts"."project_id" = "projects"."id"
inner join "comments" on "comments"."post_id" = "posts"."id"
inner join "addresses" on "addresses"."company_id" = "companies"."id"
where "addresses"."name" = 'Address Foo'
and "comments"."message" = 'Comment 3/3/2/1';
在這里,查詢有點不切實際,但它證明了我想要表達的觀點。關鍵是要有一個帶有幾個連接的查詢,這樣我就可以弄清楚如何按順序步驟撰寫它。
問題的第一部分是(我想我已經部??分弄清楚了),您如何將這些連接撰寫為一系列獨立步驟,其中一個的輸出饋入另一個的輸入?此外,是否有不止一種方法可以做到這一點?
// step 1
let companies = select('companies')
// step 2
let projects = join(companies, select('projects'), 'id', 'company_id')
// step 3
let posts = join(projects, select('posts'), 'id', 'project_id')
// step 4
let comments = join(posts, select('comments'), 'id', 'post_id')
// step 5
let finalPosts = posts.filter(post => !!comments.find(comment => comment.post_id === post.id))
// step 6
let finalProjects = projects.filter(project => !!posts.find(post => post.project_id === project.id))
// step 7, could also be run in parallel to step 2 potentially
let addresses = join(companies, select('addresses'), 'id', 'company_id')
// step 8
let finalCompanies = companies.filter(company => {
return !!posts.find(post => post.company_id === company.id)
&& !!addresses.find(address => address.company_id === company.id)
})
使用某種索引可能會更優化這些過濾器,但我認為這無關緊要。這只是表明似乎有大約 8 個步驟可以找到我們正在尋找的公司。
主要問題是,如何自動從 SQL 查詢中找出步驟?
我不是在問如何將 SQL 查詢決議為 AST。假設我們有某種我們正在處理的物件結構,比如 AST,開始。
您將如何擁有結構化物件形式的 SQL 查詢,這樣才能導致這 8 個步驟?我希望能夠指定一個查詢(使用自定義的類似 JSON 的語法,而不是 SQL),然后讓它將查詢分成這些步驟來分而治之,可以說并分部分執行查詢(用于學習如何實作分布式資料庫)。但我看不出我們是如何從類似 SQL 的語法發展到 8 個步驟的。你能說明如何做到這一點嗎?

One aspect is breaking at least the where conditions into CNF.
uj5u.com熱心網友回復:
實作連接是一個巨大的話題,可能超出了 StackOverflow 答案的范圍。
如果您正在尋找有關如何實作連接的實用資訊,我建議...
- 使用索引的連接操作部分,盧克用于不同型別的連接實作。
- The SQLite Query Optimizer Overview的第 7 節介紹了連接。并閱讀 SQLite 源代碼。它與實際的 SQL 實作一樣小。
- Postgresql的輸出
explain提供了關于它如何實作查詢的非常詳細的資訊。它們在運算子優化資訊中進行了解釋
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420537.html
標籤:
下一篇:腳本的復雜性
