问题:
背景
文章表(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:
按照数据库设计三大范式来说,没必要扩展新表