【发布时间】: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”,或者他们可以将别名命名为任何他们想要的名称。
我的一些疑惑:
最初我坚持使用 site_access 将所有内容链接在一起,客户端可以访问站点以及它具有哪些访问权限以及从他们的访问权限中每个人都有哪些命令,这是一个好方法吗?
我有许多将从数据库中提取的命令,但由于有些命令有自己的别名,所以我不薄我可以使用位掩码进行访问,并且如果不为空,我仍然可以查询别名所以我可以必须使用命令列表还是有好的选择?
我应该使用什么引擎,InnoDB 还是 MyISAM?
可以混合引擎还是根本不是一个好主意?
我应该对当前的表结构进行哪些更改,您能否提供任何示例(如果可能)?
更新:
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