Re: [请益] DB设计上为何不要都开NVARCHAR2(4000)

楼主: yr (Sooner Born Sooner Bred)   2014-08-16 21:20:26
※ 引述《returnbool (lasa)》之铭言:
: 各位前辈,目前同仁们在讨论一个问题,主要是关于数据库设计方面,
: 根据Oracle的说明 NVARCHAR2 为长度可变动的字段格式,
: 有个问题是,假设设计身分证的字段,
: 当我把字段设定成ID_NUM NVARCHAR2(10) 与 ID_NUM NVARCHAR2(4000)
如果我没搞错, NVARCHAR2 是用来存 unicode 资料的,如果只是要存
台湾身分证字号应该不需要用到这个吧?
: 就前提来看,只要我都只存10个字符,那个所占用的空间"应该"是一样的,
其实想想看如果你要实作把你的 row 存在档案里面,该怎么做,就可以知
道占用空间会不会一样,会不会有其它缺点产生。
一般这种非固定长度字段,会多用一些空间来储存该字段的长度,用来
计算下一个字段储存的地方。我不知道 Oracle 怎么处理,但是 MySQL
的 MyISAM 如果宣告的最高长度低于 256 bytes ,会用一个 byte ,
超过的话,则会有两个 bytes 。这样 10 跟 4000 就会有差异了。
当然不能排除 Oracle 用固定的 k bytes 来做这部分,这样就没差异。
: 如果说站在这个角度上,我将所有的字段都设定成 NVARCHAR2(4000),
: 那么有没有非常显在的缺点 ?
: 目前是想像的到的
: 1. 无法从DB Schema看出长度限制
: 2. table fragmentation
: 3. 效能问题
: 还有其他潜在的问题吗 ? 若是都把字段设成NVARCHAR2(4000)的话呢 ?
想想看如果有个状况( bug 或是输入错误没检查到等等),导致某笔资料
长度超过 10 ,那就跟资料结构课里面会看到的,你要在一个阵列中间插入
一个值,那么后面的资料都要往后移动一格,对系统会有什么样的冲击?
要记住磁盘存取是很慢的。到时候修正的时候,是不是也会有类似的状况
发生?
当然以上的说明有点简化,有些数据库会有特殊技巧来处理这些问题,主要
目的是建议碰到类似问题,想想底层实作部分,可以帮助你分析选择的利与
弊,然后做出 Z>B 的选择。
作者: lovdkkkk (dk)   2014-08-16 21:53:00
作者: sing10407 (阿U)   2014-08-16 22:56:00
作者: Abbee (阿比)   2014-08-17 06:58:00

Links booklink

Contact Us: admin [ a t ] ucptt.com