Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 您最有用的数据库标准是什么?_Sql_Database_Standards_Entity Relationship - Fatal编程技术网

Sql 您最有用的数据库标准是什么?

Sql 您最有用的数据库标准是什么?,sql,database,standards,entity-relationship,Sql,Database,Standards,Entity Relationship,我有一些想法,一些是随着时间的推移积累起来的,但我真的想知道在对数据库建模时是什么让事情顺利进行的: 表名与主键名和描述码匹配 模式是按功能区域划分的 尽可能避免使用复合主键(使用唯一约束) Camel Case表名和字段名 不要在表前面加tbl_,或在procs前面加SP_(无匈牙利符号) OLTP数据库应至少在BCNF/4NF中 良好的数据库设计和规范化每个人都以相同的基本格式编写SQL查询(视图、存储过程等)。它确实有助于今后的开发/维护工作。我总是尽量不使用字段名中的类型-“sFirst

我有一些想法,一些是随着时间的推移积累起来的,但我真的想知道在对数据库建模时是什么让事情顺利进行的:

  • 表名与主键名和描述码匹配
  • 模式是按功能区域划分的

  • 尽可能避免使用复合主键(使用唯一约束)
  • Camel Case表名和字段名
  • 不要在表前面加tbl_,或在procs前面加SP_(无匈牙利符号)
  • OLTP数据库应至少在BCNF/4NF中

  • 良好的数据库设计和规范化

    每个人都以相同的基本格式编写SQL查询(视图、存储过程等)。它确实有助于今后的开发/维护工作。

    我总是尽量不使用字段名中的类型-“sFirstName”、“sLastName”或“iEmployeeID”。虽然它们一开始是匹配的,但如果某些内容发生了更改,它们将不同步,而且以后更改这些名称是一件非常头痛的事情,因为您还必须更改从属对象

    Intellisense和GUI工具使了解列的类型变得很简单,因此我觉得这没有必要。

    • 使用相同的前缀命名类似的目标存储过程,例如,如果您有3个Person存储过程。这样,person的所有内容都集中在一个地方,您可以轻松地找到它们,而无需查看所有程序来找到它们。
      • 人格更新
      • 个人删除
      • 人格创造
    • 当您有一组包含相关数据的表时,对表执行类似的操作。例如:
      • 发票抬头
      • 发票行
      • 发票行详细信息
    • 如果在数据库中有模式选项,请使用它们。看到这样更好:
      • 发票.页眉
      • 发票.行.项目
      • 发票.行.项目.明细
      • 个人。更新
      • 人。删除
      • 人。创造
    • 除非没有其他合理的方法来实现这个目标,否则不要使用触发器
    • 给字段名一个有意义的前缀,这样您就可以知道它们来自哪个表,而不需要别人解释。这样,当您看到引用的字段名时,就可以很容易地判断它来自哪个表
    • 对包含类似数据的字段使用一致的数据类型,即在一个表中不要将电话号码存储为数字,在另一个表中不要将varchar存储为数字。事实上,不要将其存储为数字,如果我遇到一个负数电话号码,我会生气的
    • 不要在表/字段名称中使用空格或其他模糊字符。它们应该完全是字母数字的——或者,如果我有我的druthers,除了下划线,它们应该完全是字母数字的。我目前正在开发一个继承的系统,其中表名和字段名包含空格、问号和感叹号。让我每天都想杀了设计师
    • 不要使用语法关键字作为对象名,从中检索数据会让人头疼。我讨厌把对象名包装成[index],这是两个不必要的字符,我不需要输入该死的你
    除了标准化为3NF或BCNF(更多信息请参见中的),我发现以下内容非常有用:

    • 将表格命名为复数名词
    • 将列命名为sigular
    所以“People”表有一个“PersonID”列

    • 只要3NF或BCNF的规则仍然有效,复合密钥就没有问题。在许多情况下(如“多对多”情况),这是完全可取的
    • 避免在列名中重复表名。无论如何,peoplePersonID最好写成table.column,可读性更高,因此可以自文档化。至少对我来说,PersonID更好
    • 在删除时,应非常小心地使用级联
    • 请记住,NULL表示两件事之一:要么未知,要么不适用
    • 还请记住,空值对联接有有趣的影响,因此请练习左、右和全外部联接

    除了第五条,我几乎同意你在那里所说的一切。我经常在表和存储过程中使用前缀,因为我们开发的系统有很多不同的功能区域,所以我倾向于在表和存储过程前面加一个标识符,使它们能够在ManagementStudio中根据它们所属的区域很好地分组


    示例:cjso_用户、cjso_角色,然后是路由_用户、路由_角色。这听起来像是数据复制,但实际上,两个不同的用户/角色表用于完全独立的系统功能(cjso将用于基于客户的电子商务应用程序,而路由将代表使用路由系统的员工和分销商)。

    我的Oracle标准是:

    • 关键词总是大写
    • 数据库对象名称始终为小写
    • 下划线将取代空格(例如,SQL Server上不会有任何常见的驼峰大小写约定)
    • 主键几乎总是被命名为“id”
    • 引用完整性将得到加强
    • 整数值(包括表ID)通常总是数字(19,0)。这样做的原因是,这将适合64位有符号整数,因此允许使用Java长类型,而不是更笨拙的BigInteger
    • 尽管在某些列名后面加上“_number”的说法有误,但此类列的类型将是VARCHAR2而不是数字类型。数字类型是为主键和进行算术运算的列保留的
    • 我总是使用技术主键;及
    • 每个表都有自己的密钥生成序列。该序列的名称将为_seq
    对于SQL Server,唯一的修改是对数据库对象名称使用驼峰大小写(即PartyName而不是party_name)

    查询将倾向于
    SELECT field1, field2, field2
    FROM tablename t1
    JOIN tablename2 t2 ON t1.id = t2.tablename_id
    WHERE t1.field1 = 'blah'
    AND t2.field2 = 'foo'
    
    People Table
    PEO_PersonID
    PEO_FirstName 
    ...
    
    Select * -- naughty!
    From People
    Join Orders on PEO_PersonID = ORD_PersonID
    --...
    
    select a.field1, b.field2
    from       any_table   a
    inner join blah        b on b.a_id       = a.a_id
    inner join yet_another y on y.longer_key = b.b_id
    where a.field_3         > 7
    and   b.long_field_name < 2;
    
    SELECT p.Name, o.Quantity FROM Products p, Orders o WHERE o.ProductID = p.ID
    
    SELECT p.Name, o.Quantity FROM Products p, Orders o WHERE o.ProductID = p.ProductID