【问题标题】:database, table and column naming conventions [closed]数据库、表和列命名约定 [关闭]
【发布时间】:2009-12-04 14:20:26
【问题描述】:

你知道如何在mysql数据库中使用命名约定吗?我已经下载了一个 mysql 示例数据库。

这里是:

CREATE DATABASE IF NOT EXISTS classicmodels  DEFAULT CHARACTER SET latin1;
USE  classicmodels ;
DROP TABLE IF EXISTS  customers ;
CREATE TABLE  customers  (
   customerNumber  int(11) NOT NULL,
   customerName  varchar(50) NOT NULL,
   contactLastName  varchar(50) NOT NULL,
   contactFirstName  varchar(50) NOT NULL,
   phone  varchar(50) NOT NULL,
   addressLine1  varchar(50) NOT NULL,
   addressLine2  varchar(50) default NULL,
   city  varchar(50) NOT NULL,
   state  varchar(50) default NULL,
   postalCode  varchar(15) default NULL,
   country  varchar(50) NOT NULL,
   salesRepEmployeeNumber  int(11) default NULL,
   creditLimit  double default NULL,
  PRIMARY KEY  ( customerNumber )
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

编辑:

我喜欢什么:

    CREATE DATABASE IF NOT EXISTS classic_models;
    USE  classic_models ;
    DROP TABLE IF EXISTS  customers ;
    CREATE TABLE  customers  (
       customer_number  int(11) NOT NULL,
       customer_name  varchar(50) NOT NULL,
       -- or i define the column name this way:
       name varchar(50) NOT NULL, -- NOT customerName and NOT customer_name
       PRIMARY KEY  ( customer_number )
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

我说的对吗?

我推荐一篇文章:来自 Faruk Ateş 的 sql convention 您对这里的命名约定有什么建议吗?

【问题讨论】:

    标签: naming convention


    【解决方案1】:

    关于命名约定,您永远不会对(或错)。当你从一个雇主到另一个雇主时,你会在每个工作场所遇到不同的惯例,你总是必须适应。你已经说明了你喜欢什么,所以在处理你自己的项目时,只需使用它,除非你的系统是建立在其他东西之上的,它始终使用另一个约定。然后我会说你最好在那个项目中使用那个约定。一致性 > 偏好。

    【讨论】:

      【解决方案2】:

      如果您不喜欢这个主意,请保持冷静,
      但是您是否考虑过列名独立于表名

      语义

      语义是:
      “如果两个字段分别称为 startDate 和 endDate,那么它们指定的日期决定了当前表所考虑的期间。”

      该语义通常跨表,因此具有一致的名称是好的。

      实施问题

      在数据库中

      也许有些人说,如果那个公共列名以表名为前缀,他们仍然理解。但在几个用例中,我们被这个咬住了,更喜欢:

      • 对于您使用元请求(例如,创建一个请求以读取所有名为 startDate 的列,或查找所有使用某些参考数据的表),固定名称要容易得多。
      • 如果名称固定,存储过程或触发器也可以更轻松地重复使用。

      ORM

      ORM 非常擅长让您定义一个字段一次,然后创建将自动拥有该字段的子类(也使用组合)。数据库没有子类化,但是

      • 如果映射到类上的各个表对列使用相同的名称,一切都很自然。
      • 否则,您必须手动编码(或声明)代码中的 startDate 在数据库中实现为 XXXStartDate 或 XXX_start_date...

      需要别名

      有些请求是自连接的,两次连接同一个表,因此在每种情况下都需要为表名使用别名。

      大多数其他手动编码的请求会连接多个表。这种命名策略会增加两列具有相同名称的可能性,因此需要使用别名。那是问题吗?我认为不是因为:

      1. 通常建议使用别名,并认为是良好做法
      2. 在这两种情况下都使用别名可实现更一致的编码环境。
      3. 与表名相比,使用别名有一些优势:
        一种。可以允许长而清晰的表名,包括按“模块”对表进行分组的前缀,因为可以在请求中使用较短的别名。
        湾。虽然表名对于访问数据库的所有应用程序的所有模块都是固定的,但应用程序或模块可以在其请求中使用不同的别名,从而允许在请求中提供更多语义(就像命名的选择一样代码中的变量,规则相同)。

      【讨论】:

      • @KLE,实际上我也在考虑是否使用“独立于表名的列名”。它带来了更短的长度,但我不确定它是否有效。你有什么想法吗?
      • @garcon1986 效率如何?
      • @KLE,我以前使用过独立于表的列名,但我发现将它与外键和主键一起使用并不是一个好主意。它可能会带来误解。现在,我使用 table_id 作为主键,并让其他列名独立于表名。至于“高效”,当我使用“table_”+“列名”作为PK或FK时,更容易理解。所以在修改或演进程序时不会浪费时间去理解架构。
      【解决方案3】:

      您显示的两种命名约定都是完全可以接受的。 writingLikeThis 更容易输入,而 writing_like_this 更容易阅读。最重要的是一致性。选择一种命名约定并坚持下去。

      【讨论】:

      • 一致性可能是最重要的部分。如果您不是唯一的开发人员,或者您只处理架构的一部分,那么与架构的其余部分保持一致同样重要——如果不是更重要的话。
      猜你喜欢
      • 2010-09-05
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多