本地运行
1 | hexo generate |
1 | hexo server |
服务器部署
1 | hexo clean |
源码提交
1 | git checkout -b blog-source |
1 | warning: adding embedded git repository: themes/next |
实体建模法也有着自己先天的缺陷,由于实体说明法只是一种抽象客观世界的方法,因此,注定了该建模方法
只能局限在业务建模和领域概念建模阶段。因此,到了逻辑建模阶段和物理建模阶段,则是范式建模和维度建模发挥长处的阶段
实体是现实世界中存在的事物或发生的事件,是现实世界中任何可识别、可区分的事物。实体可以是人,可以是物,也可以是发生的某件事,比如一场篮球比赛。每一个实体都必须具备一定的特征,用来区分一个个实体,这些特征称为属性,每个实体可以用若干个属性来刻画,每个属性又有一定的取值类型和取值范围,属性是变量,其取值范围是属性的值域。实体建模法是根据客观世界中的一个个实体,以及实体之间的关系,在数据建模的过程中引入这种区分方法,将整个业务分成一个个实体,从而建立数据模型。实体建模可以比较容易的实现模型的划分,抽象出具体的业务概念,创建符合自己需要的数据库模型。实体建模是对客观世界的抽象,因此该方法建立的模型具有一定的局限性,适合于特定的领域。
维度在数学上指独立参数的数据,在数据分析领域,是指描述事物的角度和方面,是数据库当中,描述某一事物的方法和属性的数目。维度建模就是针对给定的事物,使用不同的描述方法,记录该事物在不同分类方法当中每个属性的值。如对人进行维度建模时,按照性别的维度可以分为男和女,按照年龄段可以分为儿童、少年、青年、中年、老年,按照收入水平可以分为3000以下、3000-6000、6000-10000,10000以上等集中类别。
维度建模法的好处是对于某个事物,可以在各个维度进行预处理,进行统计、分类、排序等,提高数据库操作性能,同时维度建模法建立的数据模型比较直观,可以紧密围绕业务需求建立模型,直观的反应业务中的问题,建模方法简单,不需要进行特别的抽象处理。但是维度建模法同时也存在缺点,一是在数据建模时需要进行预处理,存在大量的预处理工作,并且当业务需求发生变化时,需要重新定义维度,重新进行新维度的数据预处理,在数据预处理过程中往往存在大量数据冗余,另外就是在进行维度建模时,仅仅依靠维度进行建模,不能保证数据来源的准确性和一致性,不适合在数据库底层使用。
范式就是规则,是符合某一级别关系模式的集合,构造数据库时必须遵循一定的规则。关系数据库中的关系必须满足一定的规则,即满足不同的范式。
范式建模法是将原始数据信息根据一定的数据结构和转换模型,分解、转化为规范的格式,使数据遵守一定的约束条件,每一个数据项所表达的意思明确,不产生歧义,同时各条数据之间相互独立,不存在依赖关系。
3NF范式建模,实体模型中的关系作为fact表,实体作为维度表
修复方案:
如果拼接参数是SQL的查询参数都可以通过将mybatis配置文件中的 $ 改为 #,来解决
替换规则如下:
1.将 WHERE some_field
= ‘${变量}’ 替换为 WHERE some_field
= #{param}
2.将 like ‘%${变量}%’ 替换为 like concat(‘%’, #{变量}, ‘%’)
3.将 like concat(‘%’, ${变量}, ‘%’) 替换成 like concat(‘%’, #{变量}, ‘%’)
4.将 WHERE some_field
IN (${变量}) 替换为
WHERE some_field
IN
#{item}
对于拼接的变量不是SQL参数的,而是字段名、表名的情况,可以使用安全SDK检查输入是否是合法的标识符。
1.pom 引入安全SDK依赖
com.sankuai.security
sec-sdk
${尽可能最新版本}
\2. 代码中检查输入的变量的值是否是合法的标识符。
String sortName = req.getParameter(“sortName”);
if (sortName != null && !SecSdk.isValidSqlIdentifier(sortName)) {
// 危险,可能有SQL注入,
// return or throw exception
}
参考文档:
SQL注入介绍:https://sectraining.sankuai.com/?source=source-scanner/#/document/30001
安全SDK文档:https://km.sankuai.com/page/234776924