【问题标题】:MySQL structure for personalized users access per site?用于每个站点的个性化用户访问的 MySQL 结构?
【发布时间】:2011-06-19 15:04:57
【问题描述】:

我需要一些帮助来构建一些表格,这些表格将帮助我以一种良好的个性化方式为每个客户端使用不同的访问名称,并在每个访问级别中使用个性化的允许命令。

因此考虑客户 A 创建了站点 Y,他想要创建以下访问组:

  • 管理员(拥有所有访问权限),
  • VIP(可进入房间 1),
  • 基本(可访问休息室),
  • 禁止(根本无法进入)

与客户 A 创建其个性化访问权限的方式相同通过处于该给定访问级别进行访问。

我有以下表格作为示例(抱歉,这不是数据报,当我做示例时,工作台一直在我身上崩溃,我愿意就创建数据报的替代方案提出建议,以创建与工作台一样好或更好的数据报):

  • 客户表:

    id int,
    username varchar,
    password varchar,
    status varchar
    
  • 网站表格:

    id int,
    owner_client_id,
    name varchar
    
  • 访问表:

    id int,
    name varchar,
    commands int (bitmask?)
    
  • site_access 表

    id int,
    client_id,
    site_id,
    access_id
    
  • 命令

    id int,
    action varchar,
    alias varchar,
    description varchar
    

在我的应用程序中,所有命令操作都已预先定义,用户无法更改他们所做的操作或默认名称,但允许他们创建别名。

假设我有命令踢,他们可以创建一个别名,将其命名为“k”或“explosion”,或者他们可以将别名命名为任何他们想要的名称。

我的一些疑惑:

  1. 最初我坚持使用 site_access 将所有内容链接在一起,客户端可以访问站点以及它具有哪些访问权限以及从他们的访问权限中每个人都有哪些命令,这是一个好方法吗?

  2. 我有许多将从数据库中提取的命令,但由于有些命令有自己的别名,所以我不薄我可以使用位掩码进行访问,并且如果不为空,我仍然可以查询别名所以我可以必须使用命令列表还是有好的选择?

  3. 我应该使用什么引擎,InnoDB 还是 MyISAM?

  4. 可以混合引擎还是根本不是一个好主意?

  5. 我应该对当前的表结构进行哪些更改,您能否提供任何示例(如果可能)

更新:

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`.`clients`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`clients` ;

CREATE  TABLE IF NOT EXISTS `mydb`.`clients` (
  `id` INT NOT NULL,
  `username` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `username_UNIQUE` (`username` ASC) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`sites`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`sites` ;

CREATE  TABLE IF NOT EXISTS `mydb`.`sites` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`groups`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`groups` ;

CREATE  TABLE IF NOT EXISTS `mydb`.`groups` (
  `id` INT NOT NULL ,
  `name` VARCHAR(45) NOT NULL ,
  `alias` VARCHAR(45) NOT NULL ,
  `commands` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`membership`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`membership` ;

CREATE  TABLE IF NOT EXISTS `mydb`.`membership` (
  `client_id` INT NOT NULL ,
  `group_id` INT NOT NULL ,
  PRIMARY KEY (`client_id`, `group_id`) ,
  INDEX `client_id` (`client_id` ASC) ,
  INDEX `group_id` (`group_id` ASC) ,
  CONSTRAINT `client_id`
    FOREIGN KEY (`client_id` )
    REFERENCES `mydb`.`clients` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `group_id`
    FOREIGN KEY (`group_id` )
    REFERENCES `mydb`.`groups` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`access`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`access` ;

CREATE  TABLE IF NOT EXISTS `mydb`.`access` (
  `site_id` INT NOT NULL ,
  `group_id` INT NOT NULL ,
  PRIMARY KEY (`site_id`, `group_id`) ,
  INDEX `site_id` (`site_id` ASC) ,
  INDEX `group_id` (`group_id` ASC) ,
  CONSTRAINT `site_id`
    FOREIGN KEY (`site_id` )
    REFERENCES `mydb`.`sites` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `group_id`
    FOREIGN KEY (`group_id` )
    REFERENCES `mydb`.`groups` (`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;

【问题讨论】:

    标签: mysql database-design database-schema database-engine


    【解决方案1】:

    我会做的有点不同

    • 客户表
    • 组表
    • 成员表(客户 - 组)
    • 网站表
    • 访问表(组站点)

    有关想法http://support.sas.com/resources/papers/proceedings09/265-2009.pdf,另请参阅此链接中的第 12-13 页

    【讨论】:

    • +1 这是有道理的,因此您将客户绑定到一个组,并将组绑定到站点,如果 1 个客户端也能够对多个站点具有不同的访问权限,那么该布局是否可以正常工作?
    • 是的,但您需要额外的组,例如“站点 A 低权限”、“站点 A 高权限”、“站点 B 低权限”。然后,用户可能在一个站点中的访问权限较低,而在另一个站点中的访问权限较高。
    • 是的,这就是我最初的想法,多亏了这一点,你能在其他问题上给我建议吗,比如使用 innodb 来利用 fk 或者不是真的需要,我可以只使用 myisam ... ?
    • 这里有很好的讨论。 stackoverflow.com/questions/20148/myisam-versus-innodb 看起来 innodb 是要走的路
    • 如果你不介意,我试着按照你的建议制作表格,如果你能在一些指导下查看我的问题更新,我将不胜感激;)旁注是我主要使用 myisam,所以不是确定我是否做对了,也许我所做的关键用法是不需要或放置错误的,请注意 sql 文件是由工作台自动生成的。
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多