发表于: 2018-10-19 21:50:19

1 302


今天完成的事:

数据库规范

  • 表规范
    • 表达是否的字段,以is_方式命名,类型unsigned tinyint (无符号短整),1为是,0为否。
    • 使用下划线命名法,全用小写,禁止数字两端全为下划线
    • 表名不使用复数
    • 唯一索引以uk_命名,普通索引以idx_命名
    • 小数用decimal,禁用float和doubledecimal的使用方法是column_name  DECIMAL(P,D);p为整数位数,d为小数位数,d<=p)
    • 可确定字符长度使用char,varcher长度不要超过5000。如果超过,定义为text,独立出一张表,用主键来对应,避免影响索引效率。
    • 表必备三字段:id,gmt_create,gmt_modified(个人觉得应该用时间戳更方便create_at,update_at)
  • 索引规范
    • 具有唯一特性的字段,必须建成唯一索引。
    • 超过三个表禁止join,被关联的字段需要有索引。
    • 搜索禁止左模糊或全模糊。
  • sql规范
    • 不要使用count(列名)count(常量)来代替count(*),前者不会统计到null的行
    • count(distinct       col) 计算该列除NULL之外的不重复行数,注意 count(distinct col1, col2) 是与集,如果其中一列全为NULL,那么即使另一列有不同的值,也返回为0
    • 使用isnull()来判断是否为null,null与任何值对比都为null
    • 代码中的分页逻辑,count为0时直接返回,避免执行分页语句
    • 不得使用外键与级联,一切外键概念必须在应用层解决,原因引用“说明:以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
    • 禁用储存过程(也就是将查询过程作为对象储存),难以调试和拓展,没有移植性。
    • 在删除和修改记录时,要先select,避免出现误删除
  • ORM(对象关系映射)规范
    • 查询中禁用*作为查询字段,需要哪些必须写明。(性能开销,容易与resultMap配置不一致)
    • pojo类中boolean不能加is,数据库字段必须加is_(有点那啥)
    • xml中使用#{}而不是${},防止注入
    • 不允许直接拿HashMapHashtable作为查询结果集的输出。(输出值类型不可控)
    • 表数据更新时,必须记录gmt_modified(update_at)
    • 尽量不要更新无改动字段

JOIN用法

leetcode(这次没有官方答案,师兄可以试试优化):

罗马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"输出: 3

示例 2:

输入: "IV"输出: 4

示例 3:

输入: "IX"输出: 9

示例 4:

输入: "LVIII"输出: 58解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"输出: 1994解释: M = 1000, CM = 900, XC = 90, IV = 4.


以最后的1994为例:1000-100+1000-10+100-1+5=1994

所以要判断是否存在某位后面的是否比自身大,是则为负

代码有注释版:

private int util(char c){
switch(c){
case 'I':
return 1;
       case 'V':
return 5;
       case 'X':
return 10;
       case 'L':
return 50;
       case 'C':
return 100;
       case 'D':
return 500;
       case 'M':
return 1000;
   }
return 0;
}
@Test
public void romanToInt() {
System.out.println("------------------------------------------------------------------");
   String s = "MCMXCIV";
   int sum = 0;
   //不能循环到最后一位,否则j会溢出
   for(int i = 0 ; i<s.length()-1 ; i++){
int k = util(s.charAt(i));
       System.out.println("初始k="+k);
       int j= util(s.charAt(i+1));
       System.out.println("获取的j="+j);
       //判断,转化为负数
       if(j>k){
k = -k;
           System.out.println("转换的k"+k);
       }
sum+=k;
       System.out.println("一轮循环完成的sum="+sum);
   }
System.out.println("最后循环完成的sum="+sum);
   //处理最后一个字符
   sum += util(s.charAt(s.length()-1));
   System.out.println(sum);
   System.out.println("------------------------------------------------------------------");
}

输出:

------------------------------------------------------------------

初始k=1000

获取的j=100

一轮循环完成的sum=1000

初始k=100

获取的j=1000

转换的k-100

一轮循环完成的sum=900

初始k=1000

获取的j=10

一轮循环完成的sum=1900

初始k=10

获取的j=100

转换的k-10

一轮循环完成的sum=1890

初始k=100

获取的j=1

一轮循环完成的sum=1990

初始k=1

获取的j=5

转换的k-1

一轮循环完成的sum=1989

最后循环完成的sum=1989

1994

------------------------------------------------------------------

明天计划的事情:继续复习
遇到的问题:规范方面还有欠缺 
收获:


返回列表 返回列表
评论

    分享到