我需要一些帮助来构建一些表,这些表将帮助我以一种良好的个性化方式为每个客户端使用不同的访问名称,并在每个访问级别中使用个性化的允许命令。
因此,考虑客户端 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?)
站点访问表
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;