Структура MySQL для персонализированного доступа пользователей на сайт?
Мне нужна помощь в структурировании некоторых таблиц, которые помогут мне иметь хороший персонализированный способ иметь разные имена доступа для клиента с персонализированными разрешенными командами на каждом уровне доступа.
Итак, рассмотрим, как клиент А создал сайт Y, для которого он хочет создать следующие группы доступа:
- Админ (у всех есть доступ),
- VIP (может войти в комнату 1),
- Basic (можно получить доступ к louge),
- Забанен (не может войти вообще)
Точно так же, как клиент А создает свой персонализированный доступ. Я хочу, чтобы все мои другие клиенты могли создавать свои собственные персонализированные права доступа, где они могли бы называть его как угодно на своем родном языке, а затем просто вводить команды, к которым у них будет доступ. находясь на этом заданном уровне доступа.
В качестве примера я привожу следующие таблицы (извините, что это не датаграмма, когда я делаю пример, рабочий стол продолжает падать на меня, и я открыт для предложений по альтернативам для создания дейтаграмм, таких же или лучше, чем верстак):
клиент ТАБЛИЦА:
id int, username varchar, password varchar, status varchar
сайт ТАБЛИЦА:
id int, owner_client_id, name varchar
доступ ТАБЛИЦА:
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 для связывания всего вместе, клиент, который имеет доступ к сайту и какой у него доступ, и от их доступа, какие у каждой команды есть, это хороший способ пойти с этим?
У меня есть много команд, которые будут извлечены из базы данных, но так как у некоторых есть свой собственный псевдоним, я не использую битовую маску для доступа, и все еще могу запросить псевдоним, если не ноль, то мне придется использовать список. команд или есть хорошие варианты?
Какой движок я должен использовать, 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;
1 ответ
Я бы сделал это немного по-другому
- Клиентский стол
- Групповая таблица
- Таблица членства (клиент - группа)
- Таблица сайта
- Таблица доступа (сайт группы)
Также см. Страницы 12-13 в этой ссылке для идей http://support.sas.com/resources/papers/proceedings09/265-2009.pdf