各アクセスレベルで許可されたパーソナライズされたコマンドを使用して、クライアントごとに異なるアクセス名を持つための適切なパーソナライズされた方法を持つのに役立ついくつかのテーブルを構築するために、いくつかの助けが必要です。
クライアント A がサイト Y を作成し、次のアクセス グループを作成したいとします。
- 管理者 (すべてのアクセス権を持っている)、
- VIP(ルーム1にアクセス可能)、
- ベーシック(ラウンジアクセス可)、
- 禁止(一切入場不可)
クライアント A が自分のパーソナライズされたアクセスを作成するのと同じ方法で、他のすべてのクライアントが独自のパーソナライズされたアクセスを作成できるようにして、自分の言語に適していると思われる名前を付けて、後でアクセスできるコマンドを入力できるようにしたいと考えています。その特定のアクセスレベルにいること。
例として次の表があります(これはデータグラムではなく、例を作成するとワークベンチがクラッシュし続けます。ワークベンチと同等またはそれ以上のデータグラムを作成するための代替案については、自由に提案できます):
クライアント テーブル:
id int, username varchar, password varchar, status varchar
サイト表:
id int, owner_client_id, name varchar
テーブルへのアクセス:
id int, name varchar, commands int (bitmask?)
site_access テーブル
id int, client_id, site_id, access_id
コマンド
id int, action varchar, alias varchar, description varchar
私のアプリケーションでは、すべてのコマンド アクションが事前に定義されており、ユーザーはそれらの動作やデフォルト名を変更することはできませんが、エイリアスを作成することは許可されています。
たとえば、私がコマンド kick を持っているとしましょう。"k" または "explosion" という名前のエイリアスを作成するか、エイリアスに好きな名前を付けることができます。
私の疑問のいくつか:
最初に、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;