MySQL에서 DB를 설계하고 있습니다. 사용자 또는 사무실에 여러 전화 번호를 허용하려는 경우 사용자 테이블, 사무실 테이블 및 전화 번호 테이블이 있습니다. 그래서 저는 전화 번호 테이블에 외래 키를 사무실 테이블과 사용자 테이블에 추가해야 할 필요가 있음을 압니다. 하지만 null 레코드가 없으면 어떻게해야합니까? 전화 번호 레코드에 userId가 아닌 officeId가 아닌 null을 지정하는 가장 적합한 방법은 무엇입니까?사용자 또는 사무실에 전화 번호를 매핑하는 최상의 정규화 된 방법
내 전화 번호 테이블
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;
두 값이 null의 경우, 단지 null로 설정하고 전화 번호가 사용될 때마다 사용자가 레코드를 업데이트 – thelmuxkriovar
'길이 (50)의 PasswordHash'입니다 좋지 않은 표시. 기본 "문자열"열 유형으로'VARCHAR (255)'를 사용하고 절대적으로 필요한 경우에만 길이를 제한하십시오. 'INT'를 프라이 머리 키로 사용하고, 자동 증가 타입이 아닌 사용자 이름을 사용하십시오. 그것들은 준비되지 않았다면 데이터베이스를 엉망으로 만들 것이고 바뀔 것입니다. – tadman
** 경고 ** : 사용자 고유의 액세스 제어 계층을 작성하는 것은 쉽지 않으며 심각하게 잘못 처리 할 수있는 많은 기회가 있습니다. [Laravel] (http://laravel.com/)과 같은 최신 [개발 프레임 워크] (http://codegeekz.com/best-php-frameworks-for-developers/)가있을 때 자신의 인증 시스템을 작성하지 마십시오. 강력한 [인증 시스템] (https://laravel.com/docs/master/authentication)이 내장되어 있습니다. 절대 최소한 [권장 보안 베스트 프랙티스] (http://www.phptherightway.com/#security)를 따르고 절대로 SHA1 또는 MD5 **와 같은 손상된 해시로 비밀번호를 저장하지 마십시오. – tadman