MySQL数据建模:多种用户类型/活动/关注

时间:2009-08-06 19:21:15

标签: php mysql data-modeling

我有一个项目,其中有一个包含多种用户类型的网站。而且我很难绕过最佳实践。

无论节点类型如何,我希望能够从您关注的(节点)获取活动。假装节点类型为:

用户: 组织:

组织将是可以充当用户的实体。写评论,发送消息。但是组织由可以编辑组织信息的用户组成。组织也可以关注并遵循。

  • A)用户和组织应该是单独的表吗?
  • B)一般来说应该如何存储。
  • C)如果它们实际上是2个表,那么当你从那些人那里获得活动时,联接是如何工作的?

2 个答案:

答案 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)

听起来像你的案件组织也是一个用户。这与我们的数据库非常相似,

  1. 您有一个包含每个用户和组织的表格。我们称他们为校长。在此表中对组织和用户进行相同的处理。您可以在此处存储活动等数据。您可以为类型(组织或用户)添加列。

  2. 你会有另一张关系表。它只需要两列,一列是组织,另一列是属于该组织的用户。假设一个组织有100个用户,那么每个用户在这个表中就有100个条目。