Мне нужна помощь в структурировании некоторых таблиц, которые помогут мне иметь хороший персонализированный способ иметь разные имена доступа для каждого клиента с персонализированными разрешенными командами на каждом уровне доступа.
Так что рассмотрим клиента А, создающего сайтY, для которого он хочет создать следующие группы доступа:
- Администратор (все имеют доступ),
- VIP (может получить доступ к комнате 1),
- Basic (может получить доступ к louge),
- Забанен (не может войти вообще)
Точно так же, как клиент 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;