ITPub博客

首页 > 数据库 > 数据库开发技术 > Oracle数据库设计规范篇{四}——物理设计规范【下】(列的设计、命名的规范)

Oracle数据库设计规范篇{四}——物理设计规范【下】(列的设计、命名的规范)

原创 数据库开发技术 作者:梁敬彬 时间:2025-05-07 08:27:57 0 删除 编辑

往期回顾

        Oracle数据库设计规范篇{一}——表规范   

        Oracle数据库设计规范篇{二}——物理设计规范【上】(基本规范、表设计规范)

        Oracle数据库设计规范篇{三}——物理设计规范【中】(分区设计规范)



2.4列设计及命名规范


2.4.1 采用有意义的字段名

尽量采用有意义的字段名,使描述尽可能清楚,如采用缩写,尽量使用通用的缩写语言,如addr代表address,避免出现只有自己理解的缩写。

2.4.2 应增加更新日期字段

时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。

CREATE TABLE CUSTOMER (
    CUSTOMER_ID NUMBER(10),
    CUSTOMER_NAME VARCHAR2(50),
    CREATED_DATE DATE DEFAULT SYSDATE,
    LAST_UPDATE_DATE DATE DEFAULT SYSDATE
);
-- 在恰当的场景中,可以考虑创建触发器自动更新LAST_UPDATE_DATE
CREATE OR REPLACE TRIGGER CUSTOMER_UPDATE_TRG 
BEFORE UPDATE ON CUSTOMER
FOR EACH ROW
BEGIN
    :NEW.LAST_UPDATE_DATE := SYSDATE;
END;
/

2.4.3 不要有大小写混写的对象名

数据库里不应有大小写混用的对象名,比如CustomerData。这一问题从Access 到Oracle 数据库都存在。我不喜欢采用这种大小写混用的对象命名方法,结果还不得不手工修改名字。想想看,这种数据库/应用程序能混到采用更强大数据库的那一天吗?采用全部大写而且包含下划符的名字具有更好的可读性(CUSTOMER_DATA),绝对不要在对象名的字符之间留空格。

-- 推荐做法
CREATE TABLE CUSTOMER_DATA (
    CUSTOMER_ID NUMBER(10),
    ACCOUNT_NUMBER VARCHAR2(20)
);
-- 避免做法
CREATE TABLE CustomerData (  -- Oracle会将此转为大写,但在代码中保持一致性更好
    CustomerId NUMBER(10),
    AccountNumber VARCHAR2(20)
);

2.4.4 注意不要有保留词

要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突,比如,最近我编写的一个ODBC 连接程序里有个表,其中就用了DESC 作为说明字段名。后果可想而知!DESC 是DESCENDING 缩写后的保留词。表里的一个SELECT *语句倒是能用,但我得到的却是一大堆。

-- 推荐做法
CREATE TABLE CUSTOMER_DATA (
    CUSTOMER_ID NUMBER(10),
    ACCOUNT_NUMBER VARCHAR2(20)
);
-- 避免做法
CREATE TABLE CustomerData (  -- Oracle会将此转为大写,但在代码中保持一致性更好
    CustomerId NUMBER(10),
    AccountNumber VARCHAR2(20)
);

2.4.5 保持字段名和类型的一致性

在命名字段并为其指定数据类型的时候一定要保证一致性。假如字段在某个表中叫做“agreement_number”,你就别在另一个表里把名字改成“ref1”。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。

2.4.6 仔细选择数字类型

Oracle数字的3种基本Oracle Number类型,即 ,NUMBER、BINARY_INTENER与PLS_INTEGER。NUMBER的主要功能是用来描述相关整数或是实数,但是PLS_INTEGER与BINARY_INTENER只能来描述整数。

NUMBER,是以十进制格式进行存储的,它便于存储,但是在计算上,系统会自动的将它转换成为二进制进行运算的。它的定义方式是NUMBER(P,S),P是精度,最大38位,S是刻度范围,可在-84127间取值。例如:NUMBER(5,2)可以用来存储表示-999.99999.99间的数值。P、S可以在定义是省略,例如:NUMBER(5)、NUMBER等;

BINARY_INTENER用来描述不存储在数据库中,但是需要用来计算的带符号的整数值。它以2的补码二进制形式表述。循环计数器经常使用这种Oracle Number类型。

PLS_INTEGER和BINARY_INTENER唯一区别是在计算当中发生溢出时,BINARY_INTENER型的变量会被自动指派给一个NUMBER型而不会出错,PLS_INTEGER型的变量将会发生错误。

2.4.7 给文本字段留足余量

ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大,因为时间不长你多半就会因为要添加额外的字符而难堪不已。比方说,假设你的客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。这算浪费空间吗?是有一点,但也没你想象的那么多:一个字段加长3 个字符在有1 百万条记录,再加上一点索引的情况下才不过让整个数据库多占据3MB 的空间。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。

2.4.8 列命名技巧

我们发现,假如你给每个表的列名都采用统一的前缀,那么在编写SQL 表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来,不过就连这些工具有时不也连接错误嘛。举个简单的例子,假设有两个表:Customer 和Order。Customer 表的前缀是cu_,所以该表内的子段名如下:cu_name_id、cu_surname、cu_initials 和cu_address 等。Order 表的前缀是or_,所以子段名是:or_order_id、or_cust_name_id、or_quantity 和or_description 等。


在这里插入图片描述



未完待续…

Oracle数据库设计规范篇{五} ——索引规范【上】(分区、函数、位图及外键的索引)

公众号:收获不止数据库

微信:ljbyxl1213

系列回顾


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9091385/viewspace-3083353/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
历任中电福富研究院副理事长、中盾安信研究院副院长、宁德时代技术顾问等职务,受聘电信集团专家和国家十四五课题负责人,著有《收获,不止Oracle》《收获,不止SQL优化》等多本畅销数据库技术书籍。

注册时间:2024-02-06

  • 博文量
    162
  • 访问量
    198192