用户或办公室映射电话号码的最佳规范化做法

时间:2017-09-25 20:22:00

标签: mysql sql database database-design relational-database

我正在MySQL中设计一个数据库。我有一个用户表,办公桌和电话号码表,因为我打算允许多个电话号码给用户或办公室。所以我知道我需要在电话号码表中添加外键到办公桌和用户表,而不是相反。但是如何在没有空记录的情况下做到这一点? 如果电话号码记录中的officeId和userId都不为空,那么最常规的方法是什么?

我的电话号码表

CREATE TABLE `phonenumber` (
  `Id` varchar(36) NOT NULL,
  `Title` varchar(100) DEFAULT NULL,
  `UserId` varchar(36) DEFAULT NULL,
  `SchoolId` int(11) DEFAULT NULL,
  `CreatedOn` datetime NOT NULL,
  `ModifiedOn` datetime NOT NULL,
  `CreatedBy` varchar(36) NOT NULL,
  `ModifiedBy` varchar(36) NOT NULL,
  `Number` varchar(20) NOT NULL,
  PRIMARY KEY (`Id`),
  KEY `FK_Phone_User` (`UserId`),
  KEY `FK_Phone_School` (`SchoolId`),
  CONSTRAINT `FK_Phone_School` FOREIGN KEY (`SchoolId`) REFERENCES `school` (`Id`),
  CONSTRAINT `FK_Phone_User` FOREIGN KEY (`UserId`) REFERENCES `user` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的用户表

CREATE TABLE `user` (
  `Id` varchar(36) NOT NULL,
  `UserName` varchar(20) NOT NULL,
  `DisplayName` varchar(100) DEFAULT NULL,
  `OfficialName` varchar(100) DEFAULT NULL,
  `PasswordHash` varchar(50) DEFAULT NULL,
  `CreatedOn` datetime DEFAULT NULL,
  `CreatedBy` varchar(36) DEFAULT NULL,
  `ModifiedOn` datetime DEFAULT NULL,
  `ModifiedBy` varchar(36) DEFAULT NULL,
  PRIMARY KEY (`Id`),
  UNIQUE KEY `UserName` (`UserName`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的学校表

CREATE TABLE `school` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(100) NOT NULL,
  `AddressId` varchar(36) DEFAULT NULL,
  `CreatedOn` datetime NOT NULL,
  `ModifiedOn` datetime NOT NULL,
  `CreatedBy` varchar(36) NOT NULL,
  `ModifiedBy` varchar(36) NOT NULL,
  PRIMARY KEY (`Id`),
  KEY `FK_School_Address` (`AddressId`),
  CONSTRAINT `FK_School_Address` FOREIGN KEY (`AddressId`) REFERENCES `address` (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:3)

您只需在创建NULL表格时允许Phone_numbers 字段。您被警告的是拥有NULL个完整的记录。您正确处理字段,但没有说出任何内容或说NULL。这是一个例子:

CREATE TABLE Phone_numbers(
phone_number    VARCHAR(15)    NOT NULL,
user_id         INT UNSIGNED,
office_id       INT UNSIGNED,
PRIMARY KEY (phone_number), 
CONSTRAINT RefUsers1 FOREIGN KEY (user_id)
REFERENCES Users(user_id),
CONSTRAINT RefOffices2 FOREIGN KEY (office_id)
REFERENCES Offices(office_id)
)ENGINE=INNODB
;

对于这个简单的模型 enter image description here