我有一个项目,其中有一个包含多种用户类型的网站。而且我很难绕过最佳实践。
无论节点类型如何,我希望能够从您关注的(节点)获取活动。假装节点类型为:
用户: 组织:
组织将是可以充当用户的实体。写评论,发送消息。但是组织由可以编辑组织信息的用户组成。组织也可以关注并遵循。
答案 0 :(得分:2)
好的,这是一种可行的方法。
这里的粗略策略是
account.account_id
作为其外键。然后,查询可以确定在选择其他信息时使用哪个配置文件表。这是a quick ERD我用精彩的MySQL Workbench工具敲了一下。
erd http://www.shackpics.com/files/sample_erd_co3zt3y5la0l81g4m530.png
这是该模型工具生成的CREATE脚本
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb`;
-- -----------------------------------------------------
-- Table `mydb`.`account`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `account` (
`account_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`login` VARCHAR(45) NULL ,
`password` VARCHAR(45) NULL ,
`account_type` TINYINT UNSIGNED NULL ,
PRIMARY KEY (`account_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`organization_profile`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `organization_profile` (
`organization_profile_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`account_id` INT UNSIGNED NOT NULL ,
`organization_name` VARCHAR(45) NULL ,
PRIMARY KEY (`organization_profile_id`) ,
INDEX `fk_organization_profile_account` (`account_id` ASC) ,
CONSTRAINT `fk_organization_profile_account`
FOREIGN KEY (`account_id` )
REFERENCES `account` (`account_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`user_profile`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `user_profile` (
`user_profile_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`account_id` INT UNSIGNED NULL ,
`first_name` VARCHAR(45) NULL ,
`last_name` VARCHAR(45) NULL ,
PRIMARY KEY (`user_profile_id`) ,
INDEX `fk_user_profile_account1` (`account_id` ASC) ,
CONSTRAINT `fk_user_profile_account1`
FOREIGN KEY (`account_id` )
REFERENCES `account` (`account_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`xref_user_profile_has_organization_profile`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `xref_user_profile_has_organization_profile` (
`user_profile_id` INT UNSIGNED NOT NULL ,
`organization_profile_id` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`user_profile_id`, `organization_profile_id`) ,
INDEX `fk_xref_user_profile_has_organization_profile_user_profile1` (`user_profile_id` ASC) ,
INDEX `fk_xref_user_profile_has_organization_profile_organization_pro1` (`organization_profile_id` ASC) ,
CONSTRAINT `fk_xref_user_profile_has_organization_profile_user_profile1`
FOREIGN KEY (`user_profile_id` )
REFERENCES `user_profile` (`user_profile_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_xref_user_profile_has_organization_profile_organization_pro1`
FOREIGN KEY (`organization_profile_id` )
REFERENCES `organization_profile` (`organization_profile_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
注意:我不提倡存储纯文本密码。这只是描述关系的示例模型,不包括安全访问 - 凭据存储的细节。
这里的基本策略是你可以随意“给”每个个人资料表一个“account_type”号码。例如,组织 1 ,用户 2 。
答案 1 :(得分:1)
听起来像你的案件组织也是一个用户。这与我们的数据库非常相似,
您有一个包含每个用户和组织的表格。我们称他们为校长。在此表中对组织和用户进行相同的处理。您可以在此处存储活动等数据。您可以为类型(组织或用户)添加列。
你会有另一张关系表。它只需要两列,一列是组织,另一列是属于该组织的用户。假设一个组织有100个用户,那么每个用户在这个表中就有100个条目。