Структура 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" или "взрыв", или они могли бы назвать псевдоним как угодно.

Некоторые из моих сомнений:

  1. Первоначально я пытался использовать site_access для связывания всего вместе, клиент, который имеет доступ к сайту и какой у него доступ, и от их доступа, какие у каждой команды есть, это хороший способ пойти с этим?

  2. У меня есть много команд, которые будут извлечены из базы данных, но так как у некоторых есть свой собственный псевдоним, я не использую битовую маску для доступа, и все еще могу запросить псевдоним, если не ноль, то мне придется использовать список. команд или есть хорошие варианты?

  3. Какой движок я должен использовать, InnoDB или MyISAM в моем случае?

  4. Можно ли смешивать двигатели или вообще не очень хорошая идея?

  5. Что я должен изменить в моей текущей структуре таблицы и не могли бы вы предоставить какие-либо образцы (если это возможно)?

ОБНОВИТЬ:

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

Другие вопросы по тегам