请问数据库在创建表的时候如何设计表关系,一对一,一对多,多对多 请高手举例说明。谢谢!!!

请问数据库在创建表的时候如何设计表关系,一对一,一对多,多对多 请高手举例说明。谢谢!!!,第1张

多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。

按照数据库的增删查改 *** 作,多对多关系的查找都可以用inner join或者

select from 主表 where id in (select 主表id from 关系表)

1,角色任命型

特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。

界面特点:显示主表,用checkbox或多选select设置多选关系。

例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。

增加关系:如果没有组合纪录,insert之。

删除关系:如果有组合纪录,删除之。

2,集合分组型

特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。

界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。

例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表)

增加关系:同版主任命型。

删除关系:同版主任命型。

3,明细帐型

特点:关系表可以有重复纪录,关系表一般有时间字段,有主键,可能还有文字型的字段用来说明每次发生关系的原因(消费)。

界面特点:显示关系表,用radio或下拉设置单选关系。

例如:现金消费明细帐或订单(用户表-订单表-消费原因表),用户可能多次在同一事情上重复消费。积分变化纪录也属于这类。

增加关系:不管有没有组合纪录,insert之,纪录时间。

删除关系:根据关系表PK删除。

4,评论回复型

特点:同明细帐型关系表一般有时间字段,有主键,区别是重点在文字型的字段用来说明每次发生关系的内容(评论回复)。

界面特点:回复文本框。

例如:论坛回复(用户表-回复表-帖子表),用户可能多次在不同帖子上评论回复费。

增加关系:不管有没有组合纪录,insert之,纪录时间和文字。

删除关系:根据关系表(回复表)PK删除。

5,站内短信型

特点:主副表是同一个,关系表一般有时间字段,有主键,重点在关系表文字型的字段用来说明每次发生关系的内容(消息)或者其他标记位来表示文字已读状态时间等。

界面特点:回复文本框。

例如:站内短信(用户表-短信表-用户表),用户可能给用户群发或者单发,有标记位来表示文字已读状态时间等。

增加关系:不管有没有组合纪录,insert之,纪录时间和文字。

删除关系:根据关系表(回复表)PK删除。

6,用户好友型

特点:主副表是同一个,同集合分组型,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。

界面特点:同集合分组型,显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。

例如:下载站点的文件,(文件表-关系表-文件表)可以被软件工具打开,软件工具本身也是一种文件,可以被下载。用户的好友,也是用户(用户表-好友关系表-用户表)

增加关系:同版主任命型。

删除关系:同版主任命型

可以有两种办法啦:

1在企业管理器里面建:这种方法很简单点击选中的数据库右键新建即可相信你应该会不多说了。

2在查询分析器里建:基本思路要建表,表是要在库里建的所以你要先引用你要使用的数据库加进来再开始建表,以下为一个简单实例;

create

database

student

--创建一个student数据库由于这里主要说建表所以建一个简单的数据库

use

student

--引用数据库student

create

table

Test(

--创建一个Test表

name

varchar(20)

primary

key

indentity(1,1),--列名(字段名)

数据类型

在此加主键约束就不用加非空约束

再加上自动增长列(含义从1开始增长增长量是1)

password

varchar(10)

not

null

--注意建表最后一个字段名时结尾不要加逗号否则会出错

)

CREATE TABLE 语句的主要语法及使用说明如下:

CREATE TABLE:用于创建给定名称的表,必须拥有表CREATE的权限。

<表名>:指定要创建表的名称,在 CREATE TABLE 之后给出,必须符合标识符命名规则。表名称被指定为 db_nametbl_name,以便在特定的数据库中创建表。无论是否有当前数据库,都可以通过这种方式创建。在当前数据库中创建表时,可以省略 db-name。如果使用加引号的识别名,则应对数据库和表名称分别加引号。例如,'mydb''mytbl' 是合法的,但 'mydbmytbl' 不合法。

<表定义选项>:表创建定义,由列名(col_name)、列的定义(column_definition)以及可能的空值说明、完整性约束或表索引组成。

默认的情况是,表被创建到当前的数据库中。若表已存在、没有当前数据库或者数据库不存在,则会出现错误。

mysql> USE test_db;

Database changed

mysql> CREATE TABLE tb_emp1

-> (

-> id INT(11),

-> name VARCHAR(25),

-> deptId INT(11),

-> salary FLOAT

-> );

Query OK, 0 rows affected (037 sec)

1、打开Navicat for MySQL,找到要创建数据库中数据表

2、接着我们在“表”上面单击鼠标右键,然后点击“新建表”

3、然后,右边就会出现设计表的界面,这里可以设置表的字段名,类型,长度以及是否为null等

4、设计完数据表之后,点击“保存”按钮就OK了。

5、我们在其中输入表名就点击确定就可以了,表名可以根据自己的需求来设置

CREATE TABLE `mmall_user` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户表id',

  `username` varchar(50) NOT NULL COMMENT '用户名',

  `password` varchar(50) NOT NULL COMMENT '用户密码,MD5加密',

  `email` varchar(50) DEFAULT NULL,

  `phone` varchar(20) DEFAULT NULL,

  `question` varchar(100) DEFAULT NULL COMMENT '找回密码问题',

  `answer` varchar(100) DEFAULT NULL COMMENT '找回密码答案',

  `role` int(4) NOT NULL COMMENT '角色0-管理员,1-普通用户',

  `create_time` datetime NOT NULL COMMENT '创建时间',

  `update_time` datetime NOT NULL COMMENT '最后一次更新时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `user_name_unique` (`username`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_product` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '商品id',

  `category_id` int(11) NOT NULL COMMENT '分类id,对应mmall_category表的主键',

  `name` varchar(100) NOT NULL COMMENT '商品名称',

  `subtitle` varchar(200) DEFAULT NULL COMMENT '商品副标题',

  `main_image` varchar(500) DEFAULT NULL COMMENT '产品主图,url相对地址',

  `sub_images` text COMMENT '地址,json格式,扩展用',

  `detail` text COMMENT '商品详情',

  `price` decimal(20,2) NOT NULL COMMENT '价格,单位-元保留两位小数',

  `stock` int(11) NOT NULL COMMENT '库存数量',

  `status` int(6) DEFAULT '1' COMMENT '商品状态1-在售 2-下架 3-删除',

  `create_time` datetime DEFAULT NULL COMMENT '创建时间',

  `update_time` datetime DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_category` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类别Id',

  `parent_id` int(11) DEFAULT NULL COMMENT '父类别id当id=0时说明是根节点,一级类别',

  `name` varchar(50) DEFAULT NULL COMMENT '类别名称',

  `status` tinyint(1) DEFAULT '1' COMMENT '类别状态1-正常,2-已废弃',

  `sort_order` int(4) DEFAULT NULL COMMENT '排序编号,同类展示顺序,数值相等则自然排序',

  `create_time` datetime DEFAULT NULL COMMENT '创建时间',

  `update_time` datetime DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=100031 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_order` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',

  `order_no` bigint(20) DEFAULT NULL COMMENT '订单号',

  `user_id` int(11) DEFAULT NULL COMMENT '用户id',

  `shipping_id` int(11) DEFAULT NULL,

  `payment` decimal(20,2) DEFAULT NULL COMMENT '实际付款金额,单位是元,保留两位小数',

  `payment_type` int(4) DEFAULT NULL COMMENT '支付类型,1-在线支付',

  `postage` int(10) DEFAULT NULL COMMENT '运费,单位是元',

  `status` int(10) DEFAULT NULL COMMENT '订单状态:0-已取消-10-未付款,20-已付款,40-已发货,50-交易成功,60-交易关闭',

  `payment_time` datetime DEFAULT NULL COMMENT '支付时间',

  `send_time` datetime DEFAULT NULL COMMENT '发货时间',

  `end_time` datetime DEFAULT NULL COMMENT '交易完成时间',

  `close_time` datetime DEFAULT NULL COMMENT '交易关闭时间',

  `create_time` datetime DEFAULT NULL COMMENT '创建时间',

  `update_time` datetime DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`id`),

  UNIQUE KEY `order_no_index` (`order_no`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=118 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_order_item` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单子表id',

  `user_id` int(11) DEFAULT NULL,

  `order_no` bigint(20) DEFAULT NULL,

  `product_id` int(11) DEFAULT NULL COMMENT '商品id',

  `product_name` varchar(100) DEFAULT NULL COMMENT '商品名称',

  `product_image` varchar(500) DEFAULT NULL COMMENT '商品地址',

  `current_unit_price` decimal(20,2) DEFAULT NULL COMMENT '生成订单时的商品单价,单位是元,保留两位小数',

  `quantity` int(10) DEFAULT NULL COMMENT '商品数量',

  `total_price` decimal(20,2) DEFAULT NULL COMMENT '商品总价,单位是元,保留两位小数',

  `create_time` datetime DEFAULT NULL,

  `update_time` datetime DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `order_no_index` (`order_no`) USING BTREE,

  KEY `order_no_user_id_index` (`user_id`,`order_no`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_cart` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `user_id` int(11) NOT NULL,

  `product_id` int(11) DEFAULT NULL COMMENT '商品id',

  `quantity` int(11) DEFAULT NULL COMMENT '数量',

  `checked` int(11) DEFAULT NULL COMMENT '是否选择,1=已勾选,0=未勾选',

  `create_time` datetime DEFAULT NULL COMMENT '创建时间',

  `update_time` datetime DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`id`),

  KEY `user_id_index` (`user_id`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_pay_info` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `user_id` int(11) DEFAULT NULL COMMENT '用户id',

  `order_no` bigint(20) DEFAULT NULL COMMENT '订单号',

  `pay_platform` int(10) DEFAULT NULL COMMENT '支付平台:1-支付宝,2-微信',

  `platform_number` varchar(200) DEFAULT NULL COMMENT '支付宝支付流水号',

  `platform_status` varchar(20) DEFAULT NULL COMMENT '支付宝支付状态',

  `create_time` datetime DEFAULT NULL COMMENT '创建时间',

  `update_time` datetime DEFAULT NULL COMMENT '更新时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8;

CREATE TABLE `mmall_shipping` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `user_id` int(11) DEFAULT NULL COMMENT '用户id',

  `receiver_name` varchar(20) DEFAULT NULL COMMENT '收货姓名',

  `receiver_phone` varchar(20) DEFAULT NULL COMMENT '收货固定电话',

  `receiver_mobile` varchar(20) DEFAULT NULL COMMENT '收货移动电话',

  `receiver_province` varchar(20) DEFAULT NULL COMMENT '省份',

  `receiver_city` varchar(20) DEFAULT NULL COMMENT '城市',

  `receiver_district` varchar(20) DEFAULT NULL COMMENT '区/县',

  `receiver_address` varchar(200) DEFAULT NULL COMMENT '详细地址',

  `receiver_zip` varchar(6) DEFAULT NULL COMMENT '邮编',

  `create_time` datetime DEFAULT NULL,

  `update_time` datetime DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8;

GitHub 地址:>

用户表:{用户编号(PK),用户名,密码,用户类别, 所属专业号(FK)}

课程表:{课程编号(PK),课程名,用户编号(FK) ,学分}

院 系:{院系编号(PK),院名}

专 业:{专业号(PK),专业名称 ,专业简介 ,总学时,所属院号(FK)}

参考书:{索书号(PK),课程编号(FK),ISBN/ISSN,责任者,出版日期,校图书馆连接地址,电子书连接地址}

专业课程表{专业号,课程编号} 联合主键

1

理解您的数据在设计表之前,应明确您打算如何处理数据,还要了解随着时间的推移数据会发生什么样的变化

您所做的假设将会影响最终的设计

2

您需要什么样的数据设计应用程序时,关键要了解设计的最终结果,以便确保您准备好所有必需的数据并知道其来源

例如,报表的外观、每个数据的来源以及所需的所有数据是否都存在

对项目损失最大的莫过于在项目后期发现重要报表缺少数据

3

明确所需数据的类型和来源知道需要什么样的数据后,就必须确定数据的来源

数据是否从其他数据源中导入?数据是否需要清理或验证?用户是否需要输入数据?明确所需数据的类型和来源是数据库设计的第一步

4

您打算如何处理这些数据?用户是否需要编辑这些数据?如果需要,应如何显示数据以便于用户理解和编辑?有没有验证规则和相关的查找表?要求对编辑和删除保留备份的数据输入有没有相关联的审核问题?需要为用户显示哪些摘要信息?是否需要生成导出文件?了解这些信息后,就可以想象字段之间是如何相互关联的了

5数据之间如何相互关联?将数据分组放入相关字段(例如与客户相关的信息、与发票相关的信息等),每个字段组都代表要建立的表

然后考虑如何将这些表相互关联

例如,哪些表具有一对多关系(例如,一个客户可能持有多张发票)?哪些表具有一对一关系(这种情况下,通常会考虑将其组合到一个表中)?6

随着时间的推移数据会发生什么样的变化?设计表之后,常常会由于没有考虑时间的影响而导致以后出现严重问题

许多表设计在当时使用时效果非常好,但是,常常会因为用户修改数据、添加数据以及随时间的推移而崩溃

开发人员经常会发现需要重新设计表的结构来适应这些变化

表的结构发生变化时,所有相关的内容(查询、窗体、报表、代码等)也必须随之更新

理解并预测数据会随时间推移发生哪些变化,可以实现更好的设计,减少问题的发生

7

学习如何使用查询了解如何分析和管理数据同样很重要

您应该深刻理解查询的工作原理,理解如何使用查询在多个表之间链接数据,如何使用查询对数据进行分组和汇总,以及如何在不需要以规范化格式显示数据时使用交叉表查询

好的数据设计的最终目标就是要平衡两个需要:既要随着时间的推移有效地存储数据,又要轻松地检索和分析数据

理解查询的功能对正确设计表很有帮助

1) 不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计;不同组件间所对应的数据库表之 间的关联应尽可能减少,如果不同组件间的表需要外键关联也尽量不要创建外键关联,而只是记录关联表的一个主键,确保组件对应的表之间的独立性,为系统或表 结构的重构提供可能性。2)采用领域模型驱动的方式和自顶向下的思路进行数据库设计,首先分析系统业务,根据职责定义对象。对象要符合封 装的特性,确保与职责相关的数据项被定义在一个对象之内,这些数据项能够完整描述该职责,不会出现职责描述缺失。并且一个对象有且只有一项职责,如果一个 对象要负责两个或两个以上的职责,应进行分拆。3)根据建立的领域模型进行数据库表的映射,此时应参考数据库设计第二范式:一个表中的所 有非关键字属性都依赖于整个关键字。关键字可以是一个属性,也可以是多个属性的集合,不论那种方式,都应确保关键字能够保证唯一性。在确定关键字时,应保 证关键字不会参与业务且不会出现更新异常,这时,最优解决方案为采用一个自增数值型属性或一个随机字符串作为表的关键字。4)由于第一点所述的领域模型驱动的方式设计数据库表结构,领域模型中的每一个对象只有一项职责,所以对象中的数据项不存在传递依赖,所以,这种思路的数据库表结构设计从一开始即满足第三范式:一个表应满足第二范式,且属性间不存在传递依赖。5)同样,由于对象职责的单一性以及对象之间的关系反映的是业务逻辑之间的关系,所以在领域模型中的对象存在主对象和从对象之分,从对象是从1-N 或N-N的角度进一步主对象的业务逻辑,所以从对象及对象关系映射为的表及表关联关系不存在删除和插入异常。6) 在映射后得出的数据库表结构中,应再根据第四范式进行进一步修改,确保不存在多值依赖。这时,应根据反向工程的思路反馈给领域模型。如果表结构中存在多值 依赖,则证明领域模型中的对象具有至少两个以上的职责,应根据第一条进行设计修正。第四范式:一个表如果满足BCNF,不应存在多值依赖。7) 在经过分析后确认所有的表都满足二、三、四范式的情况下,表和表之间的关联尽量采用弱关联以便于对表字段和表结构的调整和重构。并且,我认为数据库中的表 是用来持久化一个对象实例在特定时间及特定条件下的状态的,只是一个存储介质,所以,表和表之间也不应用强关联来表述业务(数据间的一致性),这一职责应 由系统的逻辑层来保证,这种方式也确保了系统对于不正确数据(脏数据)的兼容性。当然,从整个系统的角度来说我们还是要尽最大努力确保系统不会产生脏数 据,单从另一个角度来说,脏数据的产生在一定程度上也是不可避免的,我们也要保证系统对这种情况的容错性。这是一个折中的方案。8)应针 对所有表的主键和外键建立索引,有针对性的(针对一些大数据量和常用检索方式)建立组合属性的索引,提高检索效率。虽然建立索引会消耗部分系统资源,但比 较起在检索时搜索整张表中的数据尤其时表中的数据量较大时所带来的性能影响,以及无索引时的排序 *** 作所带来的性能影响,这种方式仍然是值得提倡的。9) 尽量少采用存储过程,目前已经有很多技术可以替代存储过程的功能如“对象/关系映射”等,将数据一致性的保证放在数据库中,无论对于版本控制、开发和部 署、以及数据库的迁移都会带来很大的影响。但不可否认,存储过程具有性能上的优势,所以,当系统可使用的硬件不会得到提升而性能又是非常重要的质量属性 时,可经过平衡考虑选用存储过程。10)当处理表间的关联约束所付出的代价(常常是使用性上的代价)超过了保证不会出现修改、删除、更改 异常所付出的代价,并且数据冗余也不是主要的问题时,表设计可以不符合四个范式。四个范式确保了不会出现异常,但也可能由此导致过于纯洁的设计,使得表结 构难于使用,所以在设计时需要进行综合判断,但首先确保符合四个范式,然后再进行精化修正是刚刚进入数据库设计领域时可以采用的最好办法。11)设计出的表要具有较好的使用性,主要体现在查询时是否需要关联多张表且还需使用复杂的SQL技巧。12)设计出的表要尽可能减少数据冗余,确保数据的准确性,有效的控制冗余有助于提高数据库的性能。

以上就是关于请问数据库在创建表的时候如何设计表关系,一对一,一对多,多对多 请高手举例说明。谢谢!!!全部的内容,包括:请问数据库在创建表的时候如何设计表关系,一对一,一对多,多对多 请高手举例说明。谢谢!!!、怎么在SQL数据库中新建表。、怎么在数据库里建表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9270203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存