逻辑设计中的SQL关系基数

时间:2013-04-25 13:15:18

标签: sql database-design relationship cardinality

我有以下问题。我们目前正在为一家班车服务公司工作。现在,该系统的数据库中的部分实体包括许多查找表(例如vehicle_type,employee_status等),以及一些其他表,例如vehicle和vehicle_service日志。

现在我们团队所面临的问题是我们无法就实体之间的逻辑关系基数达成一致。两个主要问题关系包括如下定义的表:

CREATE TABLE IF NOT EXISTS `user_type` (
  `type_id` tinyint(4) NOT NULL AUTO_INCREMENT,
  `description` varchar(200) NOT NULL,
  PRIMARY KEY (`type_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Store the user types - employee
 or consultant' AUTO_INCREMENT=1 ;

相关联
CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `user_type` tinyint(4) NOT NULL,
  PRIMARY KEY (`user_id`),
  KEY `user_type` (`user_type`),
  KEY `username` (`username`),
  KEY `login` (`username`,`password`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Table used when logging in 
to check access level, type of user, etc. ' AUTO_INCREMENT=1 ;

user表包含其他不相关的数据。所以这里的问题是我说(因为MySQL Workbench以这种方式进行反向设计并且更有意义)关系应该是1-many,而另一个团队成员说它应该是0-many(因为某些记录可能存在)在user_type表中user表中未使用的

我们正在谈论的另一个表关系定义如下:

CREATE TABLE IF NOT EXISTS `vehicle` (
  `vehicle_id` int(11) NOT NULL AUTO_INCREMENT,
  `registration_number` varchar(10) NOT NULL,
  PRIMARY KEY (`vehicle_id`),
  UNIQUE KEY `registration_number` (`registration_number`),
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Actual vehicle information'
 AUTO_INCREMENT=1 ;

同样,其他一些列与问题无关。这链接

CREATE TABLE IF NOT EXISTS `service_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vehicle_id` int(11) NOT NULL,
  `description` text NOT NULL,
  `date` date NOT NULL,
  `cost` double NOT NULL,
  PRIMARY KEY (`id`),
  KEY `vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Store records of all services 
to vehicles' AUTO_INCREMENT=1 ;

这应该是1-many还是0-many,因为车辆可能还没有进入服务?据我说它应该是1-many,但我不知道这是否合乎逻辑。

我们都对这整个逻辑建模事情感到非常困惑,所以任何帮助都会非常感激!

我认为首先创建数据库然后将其反向工程设计为物理模型会更容易,但从来没有逻辑。

1 个答案:

答案 0 :(得分:1)

如果是可选的,则为零到多。例如,销售代表将拥有零个或多个客户。这是为什么?因为如果有新的销售代表那么这意味着他/她没有客户开始,除非他/她当然承担辞职的销售代表的账户。

另一方面,一个或多个是强制性的。例如,具有订单日期的订单和订购的客户应在订单明细表上至少有一条记录。假设客户在2013年4月22日订购了平板电脑,那么他/她将拥有:

 Order table
 ----------------------------------------
 Orderid.  OrderDate. Customermnum
 ----------------------------------------
  1.       04/22/2013 101

 Order detail table
 ----------------------------------------
 Orderid.  Productid.  Qty.   quotedprice
 ----------------------------------------
  1.       T101       1       500

因此,在您的情况下,User to UserType为1到0或许多因为用户类型可能尚未被任何用户使用过。

现在,车辆到服务它也是1到0或许多,因为车辆可能不一定已完成服务。