主表和主表的扩展表关系处理以及如何执行搜索

2021-01-04 22:35发布

问题:

背景

  文章表(Article) 有字段如下

  Id , Title , Author , Description , Content , SortId

  1 , "文章标题" , "文章简介" , "文章内容" , 10

  然后有个新需求 , 需要为文章增加 英文标题 

 

常规做法为

  在文章表中新建字段 EnTitle ,

  Id , Title , Author , Description , Content , SortId , EnTitle

  1 , "文章标题" , "文章简介" , "文章内容" , 10 , "I'm Article EnTitle"

 

  但是这种做法比较粗暴, 假设后面还要增加  "文章来源" , "引用地址" 等等  , 这个时候要再去加字段涉及到的修改就比较麻烦 . 说白了还是扩展性不高

 

于是出现了如下解决方案

  新增一张表为 文章扩展信息表 (ArticleMate) , 表结构如下

  Id , ArticleId , Field , Value

此时如果再发生需要增加字段即为

  在 文章扩展表中增加一条数据 (以EnTItle举例)

  1 , 1 , "EnTitle" , "I'm Article EnTitle"

 

  这样设计扩展性是高了许多 , 但是有个疑问 , 如果当 ArticleMate中的EnTitle 也需要参与到搜索条件中来的话 , 此时应该怎么操作呢 ?

  

  需要一个思路来解决这个问题 , 望各位大佬不吝赐教 . 小弟谢过了

回答1:

关系型数据对这种场景的解决就是很蹩脚的,你既想要扩展方便,又想要查询舒服,鱼和熊掌怎么兼得,无论怎么设计在关系型数据库中都会有一两缺点,所以我推荐你讲数据整合后存入es,查询都走es,关系型数据库只存储和简单的查询。



回答2:

按照你这个思路做下去,很快你就会做一个谷歌搜索引擎了。



回答3:

秀儿



回答4:

用join啊。

select * from article join ArticleMate where ArticleMate.Field  = 'EnTItle' and Value = 'xxxx'

建议不要这样搞吧,文章有哪些属性应该是相对不太变化的吧,建议修改文章表结构。



回答5:

文章的基本属性基本不会太多,不会太多的就直接文章表里加,涉及到到跟文章一对多相关的信息,再加表



回答6:

按照数据库设计三大范式来说,没必要扩展新表