MYSQL - tek sütun veri birim başına veya bir sütuna birleştirmek

5 Cevap php

Ben bir blog oluşturma yaşıyorum ve bir mysql tabloda (/ düzenlemek yayınlamak için / blog mesajları silme) kullanıcı izinleri depolamak.

Ben bir izin başına sütun veya 101 kullanıcı sonrası olabilir demek ve silmek, ancak düzenleyemezsiniz olmaz gibi bir sütunda bir dizeye tüm vurmalı çalgıları birleştirmek oluşturmanız gerekir.

Bunu sormamın sebebi benim tabloda çok fazla sütun sahip endişe duyuyorum olmasıdır.

5 Cevap

Her şeyden önce, ben bir tek alana tüm izinleri birleştirerek ekarte olacak. Bu ilk başta ekonomik gibi görünüyor, ama hiç izin yapısını genişletmek veya değiştirmek gerekir eğer bir sorun biraz dönüşebilir.

Kullanıcı tabloda her izin için bir sütun oluşturmak basit bir sistem için iyi bir tasarım, ama may gelecekteki genişleme sınırı.

Ben kullanıcılar ve izinler arasında çok-çok ilişkisi uygulanması önerilir. Bu şema değiştirmeden istediğiniz izinleri gibi birçok türde eklemenizi sağlar. Bu katılmak bir basit ile sorgulamak çok kolay, ve diğer veritabanları için taşınabilir.

İki yeni tablolar oluşturarak bu başarmak. Aşağıdaki şemayı varsayarak:

CREATE TABLE `users` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(100),
    -- other user fields --
);

Biz böyle M2M izinler şemayı ekleyebilirsiniz:

CREATE TABLE `permissions` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50) NOT NULL UNIQUE,
);

CREATE TABLE `users_permissions` (
    `id` INT NOT NULL AUTO_INCREMENT PRIMARY_KEY,
    `user_id` INT NOT NULL,
    `permission_id` INT NOT NULL 
);

Daha sonra bazı örnek kullanıcıları ve izinleri ekleyebilirsiniz:

INSERT INTO `users` (DEFAULT, 'joe');
INSERT INTO `users` (DEFAULT, 'beth');
INSERT INTO `users` (DEFAULT, 'frank');

INSERT INTO `permissions` (DEFAULT, 'Administrator');
INSERT INTO `permissions` (DEFAULT, 'Write Blog');
INSERT INTO `permissions` (DEFAULT, 'Edit Blog');
INSERT INTO `permissions` (DEFAULT, 'Delete Blog');

Ve nihayet şöyle izinleri ile kullanıcılara ilişkilendirmek:

-- joe gets all permissions
INSERT INTO `permissions` (DEFAULT, 1, 1);
INSERT INTO `permissions` (DEFAULT, 1, 2);
INSERT INTO `permissions` (DEFAULT, 1, 3);
INSERT INTO `permissions` (DEFAULT, 1, 4);

-- beth can write and edit
INSERT INTO `permissions` (DEFAULT, 2, 2);
INSERT INTO `permissions` (DEFAULT, 2, 3);

-- frank can only write
INSERT INTO `permissions` (DEFAULT, 3, 2);

Küçük bir blog için, böyle esnek bir şema gerek olmayabilir, ama bu kanıtlanmış bir tasarımdır. Eğer isterseniz, aynı zamanda bu bir adım daha atın ve bir rol sistemi oluşturabilirsiniz. Bu, her kullanıcıya bir rol (tek-çok) vererek çalışır, ve her rol izinleri bir numarası vardır (çok-çok). Bu şekilde izinleri bir kullanıcı başına ayarlanmış olması gerekmez, ve sadece onlara "Yönetici" gibi bir rol atamak veya bu rol için ilgili izinleri ile birlikte "Editör" ya da "Katılımcı", olabilir.

Benim tercihim ayrı sütunlar olacaktır. Belirli izinler arıyorsanız daha kolay daha sonra sorgu yapar.

Sen, izinleri 4. kez tekerleği icat etmek gerek bazı standart tasarımları kontrol etmek isteyebilirsiniz :)

Mysql'in (standart dışı) SET type düşünün. Daha deneyimli programcılar bir bit field (mysql'in SET tipi altında bulunuyor gerçekten ne olduğu) lehine olabilir.

: Bir dize çünkü kullanmayın

  1. Bir dize bit değerlerini saklamak için çok verimsiz bir yoldur - sadece tek bir bit gereken yere, bayrak başına bir bayt kullanarak konum
  2. Bu alana karşı sorgulama iğrenç dize manipülasyonlar gerektirir ve verimli olması asla

Ben bir Mesaj, düzenle koymak ve Sütun Sil için iyi olacağını söyleyebilirim.

(: Değer Ayar, UserID, Ayarlar Tuş 4 Sütunlar) Ama izinleri Wordpress üstlenmek alırsak, onlar sadece bir diziye serialize ve sonra Ayarlar bir tabloda bu diziyi saklayın. Seni kendi tabloya izinleri verecek değilse Wordpress yöntemi sadece gerçekten çalışır düşünüyorum.

İzin İlişki Tablo - Başka bir yöntem bir USER_ID yapmaktır. Bir sütundaki izni USER_ID koymak, ve diğer. Ancak, her satır bir izinleri yapmak. IE, sen Kullanıcı numarası 1 tüm izinleri vermek isteseydiniz olurdu:

İzinler: Ekle: 1, Düzenleme: 2, Sil: 3

Tablo

Satır 1: UserID: 1 İzni: 1

Satır 2: UserID: 1 İzni: 2

Satır 3: UserID: 1 İzni: 3

Bir sütun gibi içinde bit kombinasyonları (bit alanları) kullanabilirsiniz

const READ = 1;
const WRITE = 2;
const DELETE = 4;
...

böylece çıkan izin olurdu

read-only: 1
read-write: 3
read & delete, but not write: 5
and so on...

Bir bit alanı izni kontrol etmek için, sorgu gibi görünmek zorunda

SELECT * FROM table t WHERE t.permission & required_permission

required_permission bitsel olmak veya gerekli izni bayrakları.

Ama aynı zamanda, standart tasarımları hakkında bilgi edinmek için bazı kaynaklar kontrol tavsiye ederim ...