精华内容
下载资源
问答
  • 如何定义数据库表之间的关系

    千次阅读 2006-04-21 15:56:00
    随着数据库的正规化工作的完成,数据库中的各个数据中的数据关系也就建立起来了。 在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据中。一旦完成了对这些数据元素的分类,对于数据...
    
    

    特别说明
    数据库的正规化是关系型数据库理论的基础。随着数据库的正规化工作的完成,数据库中的各个数据表中的数据关系也就建立起来了。

    在设计关系型数据库时,最主要的一部分工作是将数据元素如何分配到各个关系数据表中。一旦完成了对这些数据元素的分类,对于数据的操作将依赖于这些数据表之间的关系,通过这些数据表之间的关系,就可以将这些数据通过某种有意义的方式联系在一起。例如,如果你不知道哪个用户下了订单,那么单独的订单信息是没有任何用处的。但是,你没有必要在同一个数据表中同时存储顾客和订单信息。你可以在两个关系数据表中分别存储顾客信息和订单信息,然后使用两个数据表之间的关系,可以同时查看数据表中每个订单以及其相关的客户信息。如果正规化的数据表是关系型数据库的基础的话,那么这些数据表之间的关系则是建立这些基础的基石。

    出发点
    下面的数据将要用在本文的例子中,用他们来说明如何定义数据库表之间的关系。通过Boyce-Codd Normal Form(BCNF)对数据进行正规化后,产生了七个关系表:

    Books: {Title*, ISBN, Price}
    Authors: {FirstName*, LastName*}
    ZIPCodes: {ZIPCode*}
    Categories: {Category*, Description}
    Publishers: {Publisher*}
    States: {State*}
    Cities: {City*}

    现在所需要做的工作就是说明如何在这些表之间建立关系。

    关系类型
    在家中,你与其他的成员一起存在着许多关系。例如,你和你的母亲是有关系的,你只有一位母亲,但是你母亲可能会有好几个孩子。你和你的兄弟姐妹是有关系的——你可能有很多兄弟和姐妹,同样,他们也有很多兄弟和姐妹。如果你已经结婚了,你和你的配偶都有一个配偶——这是相互的——但是一次只能有一个。在数据表这一级,数据库关系和上面所描述现象中的联系非常相似。有三种不同类型的关系:

    一对一:在这种关系中,关系表的每一边都只能存在一个记录。每个数据表中的关键字在对应的关系表中只能存在一个记录或者没有对应的记录。这种关系和一对配偶之间的关系非常相似——要么你已经结婚,你和你的配偶只能有一个配偶,要么你没有结婚没有配偶。大多数的一对一的关系都是某种商业规则约束的结果,而不是按照数据的自然属性来得到的。如果没有这些规则的约束,你通常可以把两个数据表合并进一个数据表,而且不会打破任何规范化的规则。

    一对多:主键数据表中只能含有一个记录,而在其关系表中这条记录可以与一个或者多个记录相关,也可以没有记录与之相关。这种关系类似于你和你的父母之间的关系。你只有一位母亲,但是你母亲可以有几个孩子。

    多对多:两个数据表里的每条记录都可以和另一个数据表里任意数量的记录(或者没有记录)相关。例如,如果你有多个兄弟姐妹,这对你的兄弟姐妹也是一样(有多个兄弟姐妹),多对多这种关系需要引入第三个数据表,这种数据表称为联系表或者连接表,因为关系型系统不能直接实现这种关系。

    建立关系
    在开始着手考虑建立关系表之间的关系之前,你可能需要对数据非常熟悉。只有在熟悉数据之后,关联会比你刚开始的时候更明显。你的数据库系统依赖于在两个数据表中找到的匹配值来建立关系。如果在数据库系统中发现了一个匹配值,系统将从两个数据表中提取数据并创建一个虚拟的记录。例如,你可能想要查看某个特定的作者所写的全部书籍,在本文中,系统将从“Books”和“Authors”这两个数据表中查找相关的匹配值。需要注意的是,在大多数情况下,查询的结果是动态的,这意味着对这条虚拟记录所做的任何改动都将可能作用到底层的数据表上,这一点是非常重要的。

    进行匹配的值都是主键和外键的值。(关系模型不要求一个关系必须对应的使用一个主键来确定。你可以使用数据表中的任何备选关键字来建立关系,但是使用主键是大家都已经接受的标准。)主键(primary key)唯一的识别表中的每个记录。而外键(foreign key)只是简单的将一个数据表中的主键存放在另外一个数据表中。同样地,对于你来说也不需要做太多的工作——只是简单地将主键加到关系表中,并将其定义为外键。

    唯一需要注意的是,外键字段的数据类型必须和主键的数据类型相同。但是有些系统可以允许这条规则有一个例外,它允许在数字和自动编号(autonumbering)字段(例如在SQL服务器系统中访问Identity和AutoNumber)之间建立关系。此外,外键的值可以是空(Null),尽管强烈建议在没有特别原因的情况下,不要让外键为空。你有可能永远都不会有机会来使用需要这项功能的数据库。

    现在回到我们的示例关系表,并开始输入合适的外键。(请继续在纸上打草稿——在你的数据库系统中创建真正的数据表还为时过早。要知道在纸上纠正错误要容易得多。)要记住,你正在把主键的值添加到关系表里。只要调用实体之间的关系就行了,而其他的就简单了:

    书籍和分类是有关系的。 书籍和出版社是有关系的。 书籍和作者是有关系的。 作者和邮政编码(ZIP)是有关系的。 邮政编码和城市是有关系的。

    城市和州是有关系的。

    这一步并不是一成不变的,你可能会发现在规范化的过程中加入外键会更容易一些。在把字段移动到一个新的数据表时,你可能要把这个新数据表的主键添加到原来的数据表里,将其作为外键。但是,在你继续规范化剩余数据的时候,外键常常会发生改变。你会发现在所有这些数据表被全部规范化之后,一次添加所有的外键,这样效率会更高。

    操作数据表
    现在让我们一次操作一个数据表,就从Books数据表开始,它在这个时候只有三个字段。很明显,Authors、Categories和Publishers数据表的主键会被添加到Books里。当你完成的时候,Books数据表就有了七个字段:

    Books
    Title (PK)
    ISBN (PK)

    Price
    FirstNameFK (FK) Authors.FirstName many-to-many
    LastNameFK (FK) Authors.LastName many-to-many
    CategoryFK (FK) Categories.Category many-to-many
    PublisherFK (FK) Publishers.Publisher one-to-many

    要记住,Authors数据表里的主键是一个基于姓和名两个字段的复合关键字。所以你必须要把这个两个字段都添加到Books数据表里。要注意,外键字段名的结尾包含有FK这个后缀。加入这个后缀有助于提高可读性和自我归档。通过名称这种方式来区别外键会使得追踪它们更简单。如果主键和外键的名称不同,这没有关系。

    这里出现了三种关系:Books和Authors、Books和Categories,以及Books和Publishers。这三种关系中所存在的两种问题可能没有那么明显:

    Books和Authors之间的关系:一本书可以有多个作者。

    Books和Categories之间的关系:一本书可以被归入多个类。

    这两者的关系是多对多的关系。先前我告诉过你,数据表不能直接实现这样的关系,而需要第三个联系表来实现。(Books和Publishers的关系是一对多的关系,就像现在所说的,这样是没有问题的。)

    这两个新发现的多对多关系将需要一个联系表来包含来自每个数据表的主键,并将其作为外键。新的联系表是:

    BooksAuthorsmmlink
    TitleFK (FK) Books.Title one-to-many
    ISBNFK (FK) Books.ISBN one-to-many
    FirstNameFK (FK) Authors.FirstName one-to-many
    LastNameFK (FK) Authors.LastName one-to-many

    BooksCategoriesmmlink
    TitleFK (FK) Books.Title one-to-many
    ISBNFK (FK) Books.ISBN one-to-many
    CategoryFK (FK) Categories.Category one-to-many

    没有必要更改Categories、Authors或者Publishers数据表。但是,你必须把FirstNameFK、LastNameFK和CategoryFK这三个外键从Books里移走:

    Books
    Title (PK)
    ISBN (PK)
    Price
    PublisherFK (FK) Publishers.Publisher one-to-many

    现在,让我们转到Authors数据表上来,它现在有两个字段。每个作者都和ZIPCodes数据表中的邮政编码的值相关。但是,每个邮政编码会和多个作者相关。要实现这种一对多的关系,就要把ZIPCodes数据表中的主键添加进Authors数据表作为外键:

    Authors
    FirstName (PK)
    LastName (PK)
    ZIPCodeFK (FK) ZIPCodes.ZIPCode one-to-many

    至此,你已经准备好了处理剩下的地址部分了。看到它们被分在不同的数据表里是很让人奇怪的,但是这是遵照BCNF正确规范化数据的结果。每个邮政编码的值只会有一个对应的城市值和州值。每个城市和州的值只会被输入进其对应的数据表里一次。ZIPCodes和Cities数据表需要外键字段来实现这些关系:

    ZIPCodes
    ZIPCode (PK)
    CityFK (FK) Cities.City one-to-many

    Cities
    City (PK)
    StateFK (FK) States.State one-to-many

    States
    State (PK)

    从一个到九个
    最后,你有了九个数据表:Books、Authors、Categories、Publishers、ZIPCodes、Cities、States、BooksAuthorsmmlink和BooksCategoriesmmlink。图A是这个示例数据表的数据库最终的图形形式。很难想像一个简单的数据表会被分成九个数据表。

    图A

    最初的一个数据表现在需要九个数据表了

    由于这个示例数据库很简单,你可能会问这些关系有什么作用。看起来仍在保存冗余的数据,只不过形式不同罢了——通过外键来实现。这是因为我们的数据表现在只有很少几个字段。试想一下有十几个字段的数据表,会是什么样的一个情形。需要承认的是,你仍然需要把数据表的主键作为外键保存进关系表里,但是至多可能最多增加一到两个字段。比较一下为这个数据表里的每一条记录都添加十几个条目的情形吧。(

    展开全文
  • 知识点:数据库表的相关概念、创建数据库表的方法、设计数据库表、向数据库表中插入数据、建立不同数据库表之间的关系、删除数据库表。 1、数据表相关的一些概念 1.1 数据库里的数据是如何保存的? 数据库...

    知识点:数据库表的相关概念、创建数据库表的方法、设计数据库表、向数据库表中插入数据、建立不同数据库表之间的关系、删除数据库表。

     

    1、数据表相关的一些概念

     

    1.1 数据库里的数据是如何保存的?

            数据库到底是怎么存储数据的?比如要把学生信息存储到数据库里,能把学生塞进数据库吗?肯定是把学生的数据信息抽象出来,把一些重要信息以文字或数字的形式保存到数据库中去。

           具体是怎么保存的,有点类似于excel,是用一张二维表的形式来进行数据保存的。这里有两个名词需要注意,行(称之为记录),列(称之为字段)。表中一条记录表示现实中的一个实体(学生)。所以以后的重点就是围绕这个表来进行设计,设计他的列。这个就是存储数据的概念。

     

     

    • 记录:数据库中存储的数据表格,每一“行”(Row)实际上对应一个实体(如每一行都对应一个名人),在数据库中,通常叫作一条“记录”(Record)。
    • 字段:表格中的每一个“列”,如编号、姓名、性别、职业、代表角色/作品等,在数据库中,通常称之为“字段”。

     

    1.2  数据冗余

     

    数据冗余:在一个数据集合重复的数据称为数据冗余

            在数据库系统中,数据冗余是指数据之间的重复(比如上面学生信息表中,3条记录中都出现了“演影视剧表演”),也可以说是同一数据存储在不同数据文件中的现象(比如还有一个表,学生成绩表(该表的字段有姓名、专业、成绩),那么可以看到专业这个字段出现在两个表中,并且等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段)。

     

    减少数据冗余最常见的方法是分类存储

           比如,对上面的学生信息表进行调整,先制作一个专业编码表,然后再制作一个学生信息统计表。

     

           通过这样的方法,可以减少数据冗余,但是会增加查找数据的复杂性。比如,要查找专业为“主持人”的学生信息,原来只需要查找一个表就可以了。而现在则需要先在“专业编码表”里查询,专业为“主持人”的编码是多少,然后再到学生信息表里查到对应的人。这样一来,就增加了查找的复杂性,降低了效率。因此,在数据库中,通常允许有必要的冗余

     

    1.3 数据完整性

           数据完整性是指数据库中数据的准确性,如果多个表互相关联,那么只要修改其中一个表,与之相关的所有表都要做出相应的修改。否则数据将不再准确,也就失去完整性。(比如上面的职业编码表,将计算机专业对应的编码改为5,那么对应的学生信息表里的信息也要对应发生变化,否则就会出问题。)

            数据准确性是通过数据库表的设计和约束来实现的。例如在“学生信息表”中,如果不对表中存储的年龄信息加以限制(约束),那么学生的年龄可能会出现负数(录入错误等原因),这样的数据就不具备完整性。

             为了实现数据完整性,SQLServer提供了四种类型的约束:实体完整性约束、域完整性约束、引用完整性约束、自定义完整性约束。

    (1)实体完整性约束

    实体的概念:数据库表中的每一行数据都是一个实体。

    什么是实体完整性?实体完整性是指数据库表中行的完整性,即要求每一行数据都是唯一的不重复的。

    如何保证实体完整性?(后面详细讲解)

    • 设置主键约束:每个数据库表有且仅有一个主键,每一个主键值必须唯一,而且不允许为“空”(NULL)或重复。
    • 设置唯一键约束:唯一键在一张表中可以有多个,并且唯一键允许字段数据为NULL。
    • 设置标识列属性:标识列又称标识符列,习惯上又叫自增列。(保证了不会重复且不会为空)

     

    (2)域完整性约束

    域的概念:域就是字段,数据库表中的每一列都是一个域/字段。

    什么是域完整性?域完整性指的是必须保证字段的值是合理的。即数据库表中的列必须满足某种特定的数据类型或约束。其中约束又包括取值范围、精度等规定。

    如何保证域完整性?可以使用CHECK约束、UNIQUE约束、default默认值、identity自增、not null/null保证列的值域的完整性。

     

    (3)引用完整性

    引用的概念:一个表中的某个字段引用另一个表中的字段,被引用的表称为主表,引用表称为从表或外键表。

    什么是引用完整性?引用完整性也叫参照完整性,引用完整性指被主表中的主关键字和从表中的外部主关键字之间的关系。引用完整性是保证从表中外键列不会出现主表中对应主键列没有的项。

     

           举例:上面两张表“专业编码表”和“学生信息表”,观察他们有什么关系?“学生信息表中”的专业字段所对应的编号,引用自“专业编码表”中的专业编码字段。这时候这两张表之间就有了引用和被引用的关系。

    • 被引用的表“专业编码表”   ——主表。(用来约束其他表
    • 引用数据的表“学生信息表”——从表(或外键表)。(被主表约束
    • 建立主外键联系的字段之间的类型和意义必须一致(主表中的专业编码字段和从表中的专业字段,类型和意义必须一致)。
    • 主表中建立关系的字段必须是主键或者唯一键。
    • 删除主表数据:从表如果没有引用所要删除的主表数据,则可以删除。否则会报错。(先删除从表相关记录,再删除主表数据)

     

    (4)自定义完整性

    自定义的概念:用户自己定义规则。

    什么是自定义完整性?自定义完整性,也称域完整性规则,是对数据表中字段属性的约束。包括字段的值域、字段的类型和字段的有效规则(如小数位数)等约束,是由确定关系结构时所定义的字段的属性决定的。如,百分制成绩的取值范围在0~100之间等。再比如输入性别信息时,只允许输入“男”或“女”。

     

    1.4 主键(Primary Key)

            如果在表中存储了很多行数据,就会引发这样的问题:如何判断表中没有重复的数据行?这时就需要有一个列,这一列的值能够唯一标识表中的每一行(即一条记录),用来强制实现表的实体完整性,这样的列称之为表的“主键”。

     

            数据库主键:指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。主键主要是用于和其他表的外键关联,以及本表记录的修改与删除。

    比如:
    学生表(学号,姓名,性别,班级)
    其中每个学生的学号是唯一的,学号就是一个主键

    专业表(专业编码,专业)
    其中课程编号是唯一的,课程编号就是一个主键

    注意:

    • 一个表只能有一个主键,并且主键列不允许出现空值(NULL),尽管有的表中允许没有主键,但是通常情况下,建议为表设置一列为主键。
    • 如果两列或多列组合起来唯一地标识表中的每一行,则该主键也叫作“复合主键”。
    • 在同一张表中,如果有多个列可以用来当做主键,在选择哪个列做为主键时,需要考虑两个原则:最少性和稳定性

     

     

    1.5 外键(Foreign Key)

            外键是实施引用完整性的约束,外键涉及到两个以上的表。如果一张表中的某一列是引用另一张表中的主键,那么这列就成为外键。比如学生信息表里的列“专业”,不是学生信息表的主键,但是它和专业编码表里的列“专业编码”对应,并且“专业编码”列是专业编码表的主键。因此,学生信息表里的列“专业”,是该表的外键。一个表可以有多个外键。

     

    1.6 列的数据类型

           在创建数据库表时,必须为表中的每列指派一种数据类型。

    • 文本数据类型选择:

    Unicode编码:(统一码、万国码、单一码)是一种在计算机上使用的字符集。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

    Char、Varchar、Text储存的字符是基于ASCII编码格式,是国际化通用与标准。对于其他编码格式的字符可能会造成存储问题。Unicode字符集(万国码)就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。

    Nchar、 Nvarchar、Ntext存储的正是Unicode编码格式的字符。所以一般来说,如果含有中文字符,用Nchar、Nvarchar、Ntext, 如果只含英文字符,就用Char、Varchar、Text。

    Char性能好;Varchar节省空间。选择方法:10个字节以上的用Varchar。N类型的占用空间大,性能低,如果不准备存中文或中亚文字则尽量避免使用。

    • 整数类型选择:首先int,空间占用合适,运算速度快。如果非常在意空间的话,考虑tinyint,   超大应用场合,考虑bigint。

     

    2、创建数据库表

            数据表(或称表)是数据库最重要的组成部分之一。数据库只是一个框架,数据表才是其实质内容。如“教学管理系统”中,教学管理”数据库包 含分别围绕特定主题的6个数据表:“教师”表、“课程”表、“成绩”表、“学生”表、“班级”表和 “授课”表,用来管理教学过程中学生、教师、课程等信息。这些各自独立的数据表通过建立关系被联接起来,成为可以交叉查阅、一目了然的数据库。

    创建数据库表的前提:已经在SSMS中建立了数据库,这里已经提前创建好数据库SchoolDB.

    2.1 在SSMS中建立数据库表

    第一步:在对象资源管理器中,点击数据库SchoolDB前面的“+”号,展开数据库,展开表,单击数据右键,点击【表】

    第二步:系统会创建一个空白表,在右侧区域定义表的列名和数据类型、是否允许Null值以及其他属性

    第三步:对表进行设计,这里先设计一个学生信息表。(列名不允许中文,数据类型根据该列的值选中适合的数据类型。)

    第四步:设置表的主键,这里设置MajorNumber为主键。设置方法:选中第一列,单击数据右键,在弹出的下拉菜单中单击【设置主键】即可。

    主键设置成功以后,会在改列的左侧出现一个钥匙符号,代表该列是主键。

     

    2.2 保存数据库表

    第五步:保存数据库表。方法:单击工具栏上的保存按钮,或者快捷键Ctrl+S,进行保存。初次保存时会弹出保存对话框,按照提示给表起个名称,然后单击确定即可。这里给表起名Student。

    刷新对象资源管理器,可以看到新创建的表。

     

    2.3 完善表的设计结构

    1、是否允许为空值

           数据库表的列是否允许为空,也是一种约束。如果该列允许为空,那么在输入数据行的时候,这一列的值可以不输入。比如注册账号的时候,一些非必填项,用户可以不填写。

     

    2、建立主键

           确定了列的名称、数据类型和是否允许为空后,表的基本框架就完成了。建立主键的方法在上面第四步已经详细说明,这里不再重复。

    思考几个问题:设置为主键的列,可以允许为空吗?一个表的主键可以由多列组成吗?列设置好以后,怎么调整顺序?

     

    3、默认值

            为了存储数据的方便,在设计表的时候,可以对一些列设置默认值。比如同一个学校的学生,地址如果不填写,默认值可以是学校地址,比如教师的级别如果不输入,默认值可以是“讲师”。

           表的默认值能够未某一列定义一个值,当用户没有在某一列中输入数据时,则将定义的值赋值给这一列。

           举例,在表中新添加一列,Address,设置数据类型,允许为空,并在表的下方设置默认值。

     

    4、标识列

           在很多情况下,存储的信息中很难找到不重复的信息作为表的主键。比如一个学生信息表,如果用姓名作为主键,那么在存储数据的时候,就不允许同一个班级、甚至同一个学校存在重名的学生。这样显然比较麻烦。SQL Sererver提供了一个“标识列”,来解决这样的en问题。

           标识列本身没有具体的意义,不反映诸如地址、性别这样的信息,只是用来区别不同的学生。设置标识列的方法:举例新增加一列Id,int类型,在表的下方列属性里点击“标识规范”,在(是标识)选项中点选“是”。

    注意:

    • 如果一列的数据属于数字类型(如整数),那么可以把该列定义为标识列。
    • 定义成标识列之后,还需要分别指定“标识种子”和“标识增量”,默认值都是 1。
    • 定义了标识列之后,在以后每次输入数据的时候,该列随数据行的增加而自动增加数值,并且不会重复,第一次的数字就是“标识种子”值,以后每次按照“标识增量”增加数值。
    • 标识列通常也被定义为主键,通常所说的“自动编号”就是指标识列的数字自动增加。
    • 标识列中的数据是自动生成的,不能在该列上输入数据。

    思考:标识列可以是字符串吗? 标识列可以允许空吗? 

    测试:如果标识列的标识种子是2,标识增量是3,先添加三行数据,然后删除,接着再向表中添加数据时,标识列的值会是多少?

     

     

    2.4 向表中插入数据

            数据库表设计好以后,就需要往表中添加数据了。

    方法:选择要添加数据的表,单击鼠标右键,在弹出的下拉菜单中选择【编辑前200行】

    在SSMS右侧出现添加数据,按照自己的设计添加数据就可以了。

    这里先添加两条数据,注意观察默认值和标识列、非空属性的应用。

    数据添加完成以后,要保持,在空白地方单击鼠标右键,点击【执行SQL】即可。

     

    2.5 建立表之间的关系

    准备工作:

    1、在SchoolDB数据库中新创建一个Major表。专业编号和专业名称,其中专业编号是主键。

    2、在Major表中添加专业信息(添加4条记录)

    两个表之间的关系:Student表中的Major列,引用Major表中的MajorNumber列。因此,Student表是从表,Major表是主表。

    建立两个表之间的关系:

    第一步:选中Student表中的Major列,单击数据右键,单击【关系】

    第二步:弹出一个【外键关系】对话框,点击【添加】

    第三步:点击【添加】以后,默认添加一个【关系】

    第四步:在右侧【表和列规范】后面的输入框里单击一下数据左键,出现一个按钮,单击该按钮。

    第五步:弹出一个【表和列】窗口,这个窗口是用来对关系进行设置的。这里要分清楚两个表,谁是主表、谁是从表。点击选择设置主键表是Major里的MajorNumber列,外键吧是Student里的Major列。然后单击【确定】

    单击确定后【表和列】窗口会关闭,直接在【外键关系】窗口单击【关闭】即可。

    第六步:由于刚才的Student表已经有了改动,单击保存,在弹出的【保存】窗口中,单击【是】。

    此时两个表之间已经建立了关系。

    思考:向Student表中插入数据,测试如果Major列输入数字5,是否可以?实际演练一下看看结果。

     

     

    2.6 建立数据库关系图

            要查看表之间的关系,可以在 SQL Server Management Studio 中展开该数据库(SchoolDB),右击“数据库关系图”,在弹出的快捷菜单中选择“新建数据库关系图”选项,然后根据提示信息新建数据库关系图,在向导中选择要显示关系的表。

    第一步:选择【数据库关系图】,单击鼠标右键,选择【新建数据库关系图】。

    第二步:弹出提示框,选择【是】。

    第三步:在弹出的【添加表】窗口中,将有关系的表全部选中,然后点击【添加】

    第四步:系统创建数据库表关系图。(注意观察不同符号)

    第五步:保存数据库关系图,单击工具栏保存按钮,弹出【选择名称】窗口,起个名字,然后单击【确定】即可。

    此时可以看到关系图文件已经保存

     

     

    2.7 建立检查约束

             检査约束也叫作 CHECK 约束,用于定义列中可接受的数据值或者格式,在设计表的时候,在快捷菜单中选择“CHECK 约束”选项,然后在弹出的“CHECK 约束”对话框中单击“添加”按钮,将添加一个新的约束。

    举例:设置Student表中Age列的值为18~30

    设置方法:

    第一步:重新设计Student表。在SchoolDB数据库中找到Student表,单击鼠标右键,选择【设计】

    第二步:选中Age列,单击鼠标右键,选择【CHECK约束】

    第三步:弹出【检查约束】窗口,在窗口上点击【添加】按钮

    第四步:系统新添加一个约束,点击右侧表达式后面的输入框,然后点击最右侧的按钮

    第五步:在弹出的【CHECK约束表达式】窗口中,添加对应的表达式,然后点击【确定】

    第六步:点击【检查约束】窗口上的【关闭】按钮

    第七步:保存Student表,单击工具栏保存按钮即可。

    第八步:验证CHECK约束。方法:选中Student数据表表单击右键选择【编辑前200行】,添加一行数据,如第三行,在填写Age列的值是填写16,全部填写完成要进入下一行填写时,提示错误,错误提示与CHECK约束起冲突。

     

     

    2.8 删除数据库表

            对于不再使用的数据库表,可以删除以释放磁盘空间,右击该表,在弹出的快捷菜单中选择“删除”选项可以把该表直接删除。对于建立主外键关系的表,若要删除主表,则首先要删除相关的从表以保证数据的引用完整性。

    举例:直接删除Major表时,提示删除失败,因为有外键约束。

     

     

     

     

    =================这里是结束分割线======================

    展开全文
  • 数据库模式定义与基本表定义

    千次阅读 2018-07-27 00:15:35
  • 数据库表结构

    千次阅读 2018-08-20 16:28:54
    当前研发工作中经常出现因数据库表、数据库表字段格式不规则而影响开发进度的问题,在后续开发使用原来数据库表时,也会因为数据库表的可读性不够高,表字段规则不统一,造成数据查询,数据使用效率低的问题,所以有...

    当前研发工作中经常出现因数据库表、数据库表字段格式不规则而影响开发进度的问题,在后续开发使用原来数据库表时,也会因为数据库表的可读性不够高,表字段规则不统一,造成数据查询,数据使用效率低的问题,所以有必要整理出一套合适的数据库表字段命名规范来解决优化这些问题。

    本文是一篇包含了数据库命名、数据库表命名、数据库表字段命名及SQL语言编码的规范文档,针对研发中易产生的问题和常见错误做了一个整理和修改,为日后涉及到数据库相关的研发工作做好准备。

     

     

    数据库规范化设计要求

    一、表中避免空列

    减少数据库处理记录的复杂性,

    1、空列数目少的时候,可以设置默认值。

    2、空列数目多的时候,可以设置单独一张表存储。

    二、表不应该有重复的值或列

    创建字典表

    三、唯一的标识某一条数据

    ID  

    如有必要添加 行号 进行排序显示管理

     

    四、数据库对象统一的前缀名

    t_department 

    五、尽量只存单一实体类型数据

    一个表中的字段不要太复杂 ,能分开的单独分开建表。

     

     


    数据库相关命名规范

     

    一、数据库命名规范

    采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔,一个项目一个数据库,多个项目慎用同一个数据库

     

    二、数据库表命名规范

    2.1数据表命名规范

    (1)采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔

    (2)全部小写命名,禁止出现大写

    (3)禁止使用数据库关键字,如:name,time ,datetime,password等(user ) 不然sql语句 写成 select * from [User]

    (4)表名称不应该取得太长(一般不超过三个英文单词)

    (5)表的名称一般使用名词或者动宾短语

    (6)用单数形式表示名称,例如,使用 employee,而不是 employees

    明细表的名称为:主表的名称+字符dtl(detail缩写)

    例如:采购定单的名称为:po_order,则采购定单的明细表为:po_orderdtl 

    (7)表必须填写描述信息(使用SQL语句建表时)

     

    2.2命名规范

    ①模块_+功能点  示例:alllive_log   alllive_category

    ②功能点  示例:live   message

    ③通用表  示例:all_user

     

    2.3待优化命名示例

    ①冗余:

    错误示例:yy_alllive_video_recomment    yy_alllive_open_close_log

    说明:去除项目名,简化表名长度,去”yy_”

     

    ②相同类别表命名存在差异,管理性差

    错误示例:yy_all_live_category    yy_alllive_comment_user

    说明:去除项目名,统一命名规则,均为”yy_alllive_”开头即可

     

    ③命名格式存在差异

    错误示例:yy_showfriend    yy_user_getpoints    yy_live_program_get

    说明:去除项目名,统一命名规则,动宾短语分离动宾逻辑顺序统一

     

    三、数据库字段命名规范

    3.1字段命名规范

    (1)采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成,命名简洁明确,多个单词用下划线'_'分隔

    (2)全部小写命名,禁止出现大写

    (3)字段必须填写描述信息

    (4)禁止使用数据库关键字,如:name,time ,datetime password 等

    (5)字段名称一般采用名词或动宾短语

    (6)采用字段的名称必须是易于理解,一般不超过三个英文单词

    (7)在命名表的列时,不要重复表的名称

    例如,在名employe的表中避免使用名为employee_lastname的字段

    (8)不要在列的名称中包含数据类型

    (9)字段命名使用完整名称,禁止缩写

     

    3.2命名规范

    ①名词  示例:user_id    user_name    sex

    ②动宾短语  示例:is_friend   is_good

     

    3.3待优化命名示例

    ①大小写规则不统一

    错误示例:user_id    houseID

    说明:使用统一规则,修改为”user_id”,”house_id”

     

    ②加下划线规则不统一

    错误示例:username    userid    isfriend    isgood

    说明:使用下划线进行分类,提升可性,方便管理,修改为”user_name”,”user_id”,”is_friend”,”is_good”

     

    ③字段表示不明确

    错误示例:uid    pid

    说明:使用完整名称,提高可读性,修改为”user_id”,”person_id”

     

    3.4字段类型规范

    (1)所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary 、varbinary外,必须有默认值,字符型的默认值为一个空字符值串’’,数值型的默认值为数值0,逻辑型的默认值为数值0

    (2)系统中所有逻辑型中数值0表示为“假”,数值1表示为“真”,datetime、smalldatetime类型的字段没有默认值,必须为NULL

    (3)用尽量少的存储空间来存储一个字段的数据

    使用int就不要使用varchar、char,

    用varchar(16)就不要使varchar(256)

    IP地址使用int类型

    固定长度的类型最好使用char,例如:邮编(postcode)

    能使用tinyint就不要使用smallint,int

    最好给每个字段一个默认值,最好不能为null

    (4)用合适的字段类型节约空间

    字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能)

    避免使用NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引无效)

    少用text类型(尽量使用varchar代替text字段)

     

    3.5数据库中每个字段的规范描述 

       (1)尽量遵守第三范式的标准(3NF) 

         表内的每一个值只能被表达一次 

         表内的每一行都应当被唯一的标示 

         表内不应该存储依赖于其他键的非键信息

    (2)如果字段事实上是与其它表的关键字相关联而未设计为外键引用,需建索引

    (3)如果字段与其它表的字段相关联,需建索引

    (4)如果字段需做模糊查询之外的条件查询,需建索引

    (5)除了主关键字允许建立簇索引外,其它字段所建索引必须为非簇索引

     

    四、SQL语言编码规范 

    4.1大小写规范 

    (1)所有关键字必须大写,如:INSERT、UPDATE、DELETE、SELECT及其子句,IF……ELSE、CASE、DECLARE等

    (2)所有函数及其参数中除用户变量以外的部分必须大写

    (3)在定义变量时用到的数据类型必须小写

     

    4.2注释 

    注释可以包含在批处理中,在触发器、存储过程中包含描述性注释将大大增加文本的可读性和可维护性,本规范建议: 

    (1)注释以英文为主,实际应用中,发现以中文注释的SQL语句版本在英文环境中不可用,为避免后续版本执行过程中发生某些异常错误,建议使用英文注释

    (2)注释尽可能详细、全面创建每一数据对象前,应具体描述该对象的功能和用途,传入参数的含义应该有所说明,如果取值范围确定,也应该一并说明,取值有特定含义的变量(如boolean类型变量),应给出每个值的含义

    (3)注释语法:单行注释、多行注释 

    单行注释:注释前有两个连字符(--)对变量、条件子句可以采用该类注释

    多行注释:符号之间的内容为注释内容,对某项完整的操作建议使用该类注释

    (4)注释简洁,同时应描述清晰

    (5)函数注释: 

    编写函数文本--如触发器、存储过程以及其他数据对象--时,必须为每个函数增加适当注释,该注释以多行注释为主,主要结构如下: 

    CREATE PROCEDURE sp_xxx 

     

     

     

     数据库表设计需要满足

    1、功能需求

    2、性能需求

    3、扩展性需求

     

     

    参考:

    数据库设计规范化的 5 个要求

    数据库表设计的几条准则

    数据库表结构设计浅谈

     

     

    数据库表及字段命名规范(一)

    展开全文
  • Flowable数据库表说明

    千次阅读 2019-04-01 15:12:14
    Flowable数据库表说明 1. Flowable数据库表命名规则 2. 数据库表结构(34张表) 1. Flowable数据库表命名规则 ACT_RE_* ’RE’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息...
  • Yii2 如何定义数据库连接

    千次阅读 2016-07-10 00:11:00
    Yii2 如何定义数据库连接? 要注意的是:即除了使用\Yii::app−>set()外,还需要再多使用下面一句话:\Yii::app->set() 外,还需要再多使用下面一句话: \Yii::app->$database->open(); 因为在框架加载后再调用时...
  • 在golang的开发过程中,当我们使用orm的时候,常常需要将数据库表对应到golang的一个struct,这些struct会携带orm对应的tag,就像下面的struct定义一样: type InsInfo struct { Connections string `gorm:"column:...
  • 07-Flowable数据库表说明

    万次阅读 2018-12-11 10:55:18
    flowable数据库表说明1. flowable数据库表命名规则2. 数据库表结构 1. flowable数据库表命名规则 ACT_RE_* ’RE’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息,如,...
  • ER图和关系模型到MySQL数据库表

    千次阅读 2020-03-02 21:01:12
    本篇主要介绍了MySQL数据库表从ER图到关系模型,再到数据库表的创建过程及其表结构的修改。通过本篇的学习,可以掌握以下内容: ● 应用ER图和关系模型创建数据库表数据库表结构的修改 1、mooc数据库表的ER...
  • 数据库表命名规范

    万次阅读 2017-12-18 08:13:38
    数据库表命名规范:(1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,前缀全部大写或首字母大写,表名中包含的单词首字母大写。(2)数据库表名应该有意义,并且易于理解,最好使用可以表达功能的英文...
  • 在开发过程中,有时因数据库设计者未考虑周到,业务实体有一个属性没有对应的字段,因此需要在数据库表加一个字段,又由于此字段要求不可为空,并且在开发阶段,测试数据不多,有时是drop掉了原来的表,增加了一个...
  • 数据库-定义与操作

    千次阅读 2019-03-17 15:50:59
    数据类型 char(n) 长度为n的定长字符串 varchar(n) 最大长度为n的可变长字符串 int 长整数(4字节) bigint 大整数 (8字节) boolean 逻辑布尔量 date 日期, 包含年月日...建立基本 CREATE TABLE USERS ( Ul...
  • MySQL数据库表约束

    千次阅读 多人点赞 2018-01-16 14:48:27
    为了防止往数据中插入错误的数据,在MySQL中,定义了一些维护数据库完整性的规则,即的约束。 常见的的约束:    上表中列举的约束条件都是针对中字段进行限制, 从而保证数据中数据的正确性和...
  • 数据库表及字段命名规范

    万次阅读 2018-03-09 10:15:09
    1.数据库表命名规范:(1)表名前应该加上前缀,表的前缀一个用系统或模块的英文名称缩写,前缀全部大写或首字母大写,表名中包含的单词首字母大写。(2)数据库表名应该有意义,并且易于理解,最好使用可以表达功能的...
  • 数据库基本定义、删除及修改

    千次阅读 2019-05-21 15:30:50
    1.定义基本 创建了一个模式即建立了一个数据库的命名空间,一个框架。SQL语言使用create table语句定义基本,格式如下: create table <表名>(<列名><数据类型>[列级完整性约束条件] [,&...
  • Springboot根据实体类生成数据库表

    千次阅读 热门讨论 2019-01-08 14:13:44
    Springboot基础篇 根据实体类生成数据库表 springboot数据库(一)-springboot-JPA JPA:springboot -jpa:数据库的一系列的定义数据持久化的标准的体系 学习的目的是: 利用springboot实现对数据库的操作 第一...
  • SQL数据库表的设计

    千次阅读 2019-05-08 18:09:46
    《SQL数据库表的设计》 开发工具与关键技术:Visual Studio /SQL数据库 作者:肖春庆 撰写时间:2019年05月04日 数据库是一种存储数据的文件储物柜,用户可以以一定的方式存储并且对数据库里的数据进行新增、查询、...
  • Laravel创建数据库表结构

    千次阅读 2017-11-21 09:36:25
    迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel的schema构建器结对从而可以很容易地构建应用的数据库表结构。如果你曾经告知小组成员需要手动添加列到本地数据库...
  •  正文 一个数据库管理系统的实例中,可以建立多个数据库,一个数据库可以建立多个模式,一个模式下通常包括多个、视图和索引等数据对象。 不过一般在开发中几乎不用模式这个东西,基本上都是直接建数据库,然.....
  • @Entity @Table(name = "contract") public class Contract ...当我的contractNo定义成String类型是创建数据的时候会报错,定义成int、Long、Integer类型就不会,要怎么设置才能创建varchar类型的数据数据
  • 数据库系统

    千次阅读 2016-07-24 17:46:56
    数据库系统 ACCESS SQL SERVER mysql oracle
  • Mysql数据库表结构优化

    千次阅读 2017-10-13 16:00:23
    前面介绍了服务器硬件、操作系统、msyql服务器配置,对数据库的影响,其实最重要的是数据库表结构对数据库的影响,良好的数据库逻辑设计和物理设计是数据库获取高性能的基础,数据库结构优化的目的:1、减少数据冗余...
  • mysql 数据库表结构设计与规范

    千次阅读 2017-06-06 15:00:16
    mysql 数据库表结构设计与规范DDL(data difinition language)就是数据定义语言。1.sql语句的界定符[code]– 默认情况下” ; ” 代表sql语句的结束 delimiter 新的界定符 – 修改 // 为界定符 delimiter //2.创建...
  • Django 1.9.5 创建数据库表

    千次阅读 2016-08-19 19:41:11
    首先设计自己的数据库, 在app中的models.py内定义表格,定义完表格之后需要在MySql中创建表格. 大家可以在Django官网和其它博客与网站上看到,基本上所有的信息都是在说实用 python manage.py makemigrations 和 ...
  • 数据库表和它的实体类

    千次阅读 2017-09-25 15:13:41
    数据库表中有很多字段信息时,为了能够对数据库中的字段信息能够更方便的获取,需要在程序中建立与表对应的实体类,使取出的每一例对象信息按照list的方式存储。 处理流程: (1)连接数据库 (2)建立数据库中...
  • Jbpm数据库表的创建

    千次阅读 2006-08-19 23:23:00
    Jbpm把流程定义和流程执行都会持久化到数据库中,所以我们需要在数据库中创建所需的数据库表数据库表的创建有以下三种方式。1.手工创建 在入门套件解压后的jbpm-db/build目录中有已经生成好的创建各种数据库的...
  • 数据库实验报告1数据库定义实验

    千次阅读 2020-04-29 11:18:58
    (1)理解和掌握数据库DDL语言,能熟练地使用SQL DDL语句创建、修改和删除数据库、模式和基本。 (2)掌握SQL语句常见语法错误的调试方法。 二、 实验内容: 教材3.3数据定义中例3.1至例3.11的要求操作,并截取...
  • 每天一点数据库之-----Day 2 创建与管理数据库表  ----转载请注明出处:coder-pig 本节引言: 本节介绍的是数据库中表的创建与管理,另外,因为不同DBMS所 支持的数据类型有所差别,这里就不慢慢阐述了,有需要的自行...
  • 数据库基础:创建并定义表结构

    千次阅读 2019-08-08 11:10:43
    创建数据 定义非空约束 (字段名 字段类型 NOT NULL) 定义默认字值 (字段名 字段类型 default 默认值) 定义主键 Primary key (主键字段名) 定义外键 概念:外键是指向另一个已有数据的约束,因此外键值必须在目标...
  • springBoot下java自动创建数据库表

    万次阅读 2018-10-17 16:11:06
    ####SpringBoot环境启动项目创建数据库表 ####使用环境 windows+eclipse+mysql+navicat ####步骤 1.创建SpringBoot项目 2.新建数据库,配置连接信息 3.编写初始化数据库表类 4.运行查看结果 1.创建SpringBoot项目 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,507,351
精华内容 602,940
关键字:

怎么定义数据库表