Структура MySQL для персонализированного доступа пользователей на сайт? - PullRequest
2 голосов
/ 19 июня 2011

Мне нужна помощь в структурировании некоторых таблиц, которые помогут мне иметь хороший персонализированный способ иметь разные имена доступа для каждого клиента с персонализированными разрешенными командами на каждом уровне доступа.

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

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

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

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

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

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

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

ОБНОВЛЕНИЕ:

enter image description here

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 Ответ

1 голос
/ 19 июня 2011

Я бы сделал это немного по-другому

  • Таблица клиентов
  • Таблица групп
  • Таблица членства (клиент - группа)
  • Таблица сайта
  • Таблица доступа (сайт группы)

Также см. Страницы 12-13 в этой ссылке для идей http://support.sas.com/resources/papers/proceedings09/265-2009.pdf

...