1

请考虑以下示例。假设我们正在为在线书店构建数据库。我们有一个 Book 表包含 n 条记录,一个 Type 表包含 m 条记录。n 是一个非常大的数字。m 很小。

--------
Book
---------
BookId
BookName
BookType
---------

-------
Type
--------
TypeId
TypeName
---------

加入这两个表的传统方法是创建一个名为 BookType 的第三个表

---------- 
BookType
---------- 
BookTypeId 
BookId 
TypeId
----------

如果我们想检索具有类型的书籍记录,我们可以这样做:

select B.*, T.Name from Book B
inner join BookType BT on B.BookId = BT.BookId
inner join Type T on BT.TypeId = T.TypeId

由于 Book 表很大,所以 BookType 表更大。由于 DB 索引使用的是类 B-Tree 算法,因此时间成本将为:2log(n) + Cm。正确的?(以 Book 表和 BookType 表为索引)

但是,如果我们可以将 TypeId 存储为 JSON 数组并使用它进行连接,那么我们可以一次获取数据。时间将是 log(n) + Cm,这至少是两倍快。语法可能类似于:

select B.*, T.Name from Book B
inner join Type T on ParseJsonAsIntArray(BookType) = T.TypeId

我找不到像 ParseJsonAsIntArray() 这样的 MySQL 函数。他们为什么不这样做?如果我遗漏了明显的东西,请道歉。

4

1 回答 1

2

不,在 MySQL 中没有用于解析 JSON 的内置函数。最接近的是ExtractValue()XML 数据。此函数使用 Xpath 表达式来挑选 XML 文档的元素。但无论如何,MySQL 不支持对 XML 或 JSON 等半结构化 blob 中的元素进行索引。这注定是一个低效的查询。

但首先要做的事情。您正在尝试使用非规范化来解决实际上是关系数据库优势的问题。BookType 表会很长,但行单独非常小。所以它不会像你想象的那么糟糕。

支持 by或 by 的BookType索引搜索是一个巨大的优势。当你去规范化时,你基本上使这些查找中的一个高效,但你牺牲了另一个查找。BookType

另请参阅我对在数据库列中存储逗号分隔列表真的那么糟糕吗?

于 2012-12-09T23:50:29.483 回答