我需要一些帮助来构建一些表格,这些表格将帮助我以一种良好的个性化方式为每个客户端提供不同的访问名称,并在每个访问级别中使用个性化的允许命令。
因此,考虑客户A已创建网站Y,他想要创建以下访问组:
客户端A创建个性化访问的方式与我希望所有其他客户能够创建自己的个性化访问权限相同,他们可以将其命名为他们认为适合自己语言的任何内容,然后只需输入他们将拥有的命令通过在给定的访问级别上访问。
我将以下表格作为示例(很抱歉,这不是数据报,当我做出示例时,工作台会继续让我崩溃,我愿意建议创建与工作台一样好或更好的数据报的替代方案):
客户端表:
id int,
username varchar,
password varchar,
status varchar
网站表:
id int,
owner_client_id,
name varchar
访问TABLE:
id int,
name varchar,
commands int (bitmask?)
site_access TABLE
id int,
client_id,
site_id,
access_id
命令
id int,
action varchar,
alias varchar,
description varchar
在我的应用程序中,所有命令操作都是预定义的,并且用户无法更改它们的操作或默认名称,但允许它们创建别名。
所以,假设我有命令踢,他们可以创建一个别名来命名为“k”或“爆炸”,或者他们可以将别名命名为他们想要的任何内容。
最初我曾尝试使用site_access将所有内容链接在一起,有权访问网站的客户端及其访问权限以及访问每个网站的权限,这是一个很好的方法吗?
我有很多命令会从数据库中提取出来,但由于有些命令有自己的别名我不会瘦,我可以使用位掩码进行访问,如果不是null我仍然可以查询别名我是这样的必须使用命令列表还是有好的选择?
在我的情况下,我应该使用什么引擎,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;
答案 0 :(得分:1)
我会做的有点不同
另请参阅此链接中的第12-13页,了解提示http://support.sas.com/resources/papers/proceedings09/265-2009.pdf