私のサイトは、一般ユーザーとビジネス ユーザーとスーパー管理者の 2 種類のユーザーで構成されています。それらはすべてユーザー テーブル (名前、電子メール、パスワード) にリストされ、ビジネス ユーザーのビジネスのみの関連情報 (ビジネスの種類、住所など) を保持する busines_users テーブルが追加されます。
そして、サイトのメールを保持する 3 番目のテーブルがあります。通常のユーザーから business_users または super_admins (サポートなど) に送信されるメール。
そのため、このメール テーブルには 2 つの列 (from、to) があり、userID 列を参照する場所は users テーブルです。ここに問題があります。business_user が自分のアカウントを削除したとします。彼が送信したメールも削除するつもりです (通常のユーザーまたはスーパー管理者に向けられているかどうかに関係なく) 問題は、mails テーブルの構造が避けられないことです。上記のメールを削除すると、super_admin の正規ユーザーが HIM に送信したメールも削除されます。
調査された 2 つのシナリオがあります。
- メールをまったく削除しないでください。その場合、議論はここで終わります。
- 彼に送信されたメールが削除されないようにデータベースを再設計します (reg_users の画面にはまだメールが表示されます) が、彼が送信したメールは削除されます。
あなたは何を提案しますか?2番目のオプションを使用する場合、データベースをどのように設計する必要がありますか。ここに3つのテーブルがあります:
CREATE TABLE IF NOT EXISTS `alternative_appointm`.`users` (
`user_ID` INT(11) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
`lastname` VARCHAR(45) NOT NULL ,
`email` VARCHAR(255) NULL DEFAULT NULL ,
`password` VARCHAR(100) NULL DEFAULT NULL ,
`hash` VARCHAR(32) NULL DEFAULT NULL ,
`usertype` ENUM('1','2','3','4') NULL DEFAULT NULL ,
PRIMARY KEY (`user_ID`) ,
INDEX `fk_users_usertype1_idx` (`usertype` ASC) ,
CONSTRAINT `fk_users_usertype1`
FOREIGN KEY (`usertype` )
REFERENCES `alternative_appointm`.`usertype` (`type_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
CREATE TABLE IF NOT EXISTS `alternative_appointm`.`business_users` (
`crID` INT(11) NOT NULL ,
`address` VARCHAR(45) NULL DEFAULT NULL ,
`url` VARCHAR(45) NULL DEFAULT NULL ,
`phone` VARCHAR(20) NULL ,
`city` VARCHAR(100) NULL ,
`municipality` VARCHAR(100) NULL ,
`bus_user_type` ENUM('1','2','3','4','5') CHARACTER SET 'latin1' NULL ,
PRIMARY KEY (`crID`) ,
INDEX `fk_business_users_buz_usertype1_idx` (`bus_user_type` ASC) ,
INDEX `crID` (`crID` ASC) ,
CONSTRAINT `fk_business_users_buz_usertype1`
FOREIGN KEY (`bus_user_type` )
REFERENCES `alternative_appointm`.`buz_usertype` (`Type_id` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_business_users_users1`
FOREIGN KEY (`crID` )
REFERENCES `alternative_appointm`.`users` (`user_ID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
CREATE TABLE IF NOT EXISTS `alternative_appointm`.`mails` (
`message-iD` INT(10) NOT NULL AUTO_INCREMENT ,
`from` INT(11) NULL DEFAULT NULL ,
`to` INT(11) NULL DEFAULT NULL ,
`datetime` DATETIME NULL DEFAULT NULL ,
`subject` TEXT NULL DEFAULT NULL ,
`message` TEXT NULL DEFAULT NULL ,
PRIMARY KEY (`message-iD`) ,
UNIQUE INDEX `message-iD_UNIQUE` (`message-iD` ASC) ,
INDEX `fk_mails_users1_idx` (`from` ASC) ,
INDEX `fk_mails_users2_idx` (`to` ASC) ,
CONSTRAINT `fk_mails_users1`
FOREIGN KEY (`from` )
REFERENCES `alternative_appointm`.`users` (`user_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_mails_users2`
FOREIGN KEY (`to` )
REFERENCES `alternative_appointm`.`users` (`user_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8