MySQL veri modelleme: Çoklu kullanıcı türleri / Etkinlik / izlenerek

2 Cevap php

Ben birden fazla kullanıcı türleri ile bir site var olduğu bir proje var. Ve ben sorun bunun için en iyi uygulama kafam yaşıyorum.

Ben ne olursa olsun düğüm türü izleyin (düğümler) dan etkinlik elde edebilmek istiyorum. Düğüm türleri gibi davranmak:

User: Organization:

Bir kuruluş, bir kullanıcı olarak hareket edebilir bir varlık olacaktır. Yorumlarınızı yazın, mesaj gönderebilirsiniz. Ancak bir kuruluş orgs bilgilerini düzenleyebilirsiniz kullanıcıların oluşur. Kuruluşlar ayrıca takip edebilir, ve takip edilecek.

  • A) Kullanıcılar ve Kuruluşlar ayrı tablolar olmalı?
  • B) Genellikle bu saklanmalıdır nasıl konuşma.
  • Onlar aslında 2 tablolar iseniz takip edilenlerden aktiviteyi alırken C), nasıl bir iş katılmak mı?

2 Cevap

Tamam, burada olası bir yaklaşımdır.

Burada kaba stratejisi bu

  • Hesapları (yani, erişim bilgileri) (varlık-spesifik veri) profiller ayrıdır
  • Hesapları profil türünü belirlemek
  • Profiller yabancı anahtar ile kendi hesabına geri bağlantı. (Örneğin yorum,) Diğer ilgili tabloları, yabancı anahtar olarak account.account_id kullanmak istiyorsunuz. Sorguları sonra ek bilgi seçerken hangi profili tablo kullanılacağını belirlemek olabilir.

İşte a quick ERD Ben harika MySQL Workbench aracı ile çaldı bulunuyor.

erd

Ve burada bu model için araç tarafından oluşturulan CREATE script

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`.`account`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `account` (
  `account_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `login` VARCHAR(45) NULL ,
  `password` VARCHAR(45) NULL ,
  `account_type` TINYINT UNSIGNED NULL ,
  PRIMARY KEY (`account_id`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`organization_profile`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `organization_profile` (
  `organization_profile_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `account_id` INT UNSIGNED NOT NULL ,
  `organization_name` VARCHAR(45) NULL ,
  PRIMARY KEY (`organization_profile_id`) ,
  INDEX `fk_organization_profile_account` (`account_id` ASC) ,
  CONSTRAINT `fk_organization_profile_account`
    FOREIGN KEY (`account_id` )
    REFERENCES `account` (`account_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`user_profile`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `user_profile` (
  `user_profile_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `account_id` INT UNSIGNED NULL ,
  `first_name` VARCHAR(45) NULL ,
  `last_name` VARCHAR(45) NULL ,
  PRIMARY KEY (`user_profile_id`) ,
  INDEX `fk_user_profile_account1` (`account_id` ASC) ,
  CONSTRAINT `fk_user_profile_account1`
    FOREIGN KEY (`account_id` )
    REFERENCES `account` (`account_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`xref_user_profile_has_organization_profile`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `xref_user_profile_has_organization_profile` (
  `user_profile_id` INT UNSIGNED NOT NULL ,
  `organization_profile_id` INT UNSIGNED NOT NULL ,
  PRIMARY KEY (`user_profile_id`, `organization_profile_id`) ,
  INDEX `fk_xref_user_profile_has_organization_profile_user_profile1` (`user_profile_id` ASC) ,
  INDEX `fk_xref_user_profile_has_organization_profile_organization_pro1` (`organization_profile_id` ASC) ,
  CONSTRAINT `fk_xref_user_profile_has_organization_profile_user_profile1`
    FOREIGN KEY (`user_profile_id` )
    REFERENCES `user_profile` (`user_profile_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_xref_user_profile_has_organization_profile_organization_pro1`
    FOREIGN KEY (`organization_profile_id` )
    REFERENCES `organization_profile` (`organization_profile_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;

Düz metin parolaları depolamak Note: I do not savunucusu. Bu güvenli erişim-kimlik depolama özelliklerini kapsamaz, ilişkileri açıklamak için tek bir örnek modeldir.

Burada temel strateji keyfi her profil tablosunu bir "ACCOUNT_TYPE" numarası "vermek" olduğunu ifade etti. Örneğin, kuruluşlar 1 olacak ve kullanıcılar olurdu 2.

Ayrıca bir kullanıcı sizin durumda örgüt gibi geliyor. Bu, bu gibi görünüyor bizim veritabanına çok benzer

  1. Her kullanıcı ve kuruluşlar ile bir tablo var. Biz onlara müdür diyoruz. Organizasyon ve kullanıcı bu tabloda aynı tedavi edilir. Eğer faaliyetler gibi veri depolamak yerdir. Sen türü (org ya da kullanıcı) için bir sütun ekleyebilirsiniz.

  2. Sen ilişkiler için başka bir tablo olurdu. Bu sadece bir sütun organizasyon ve diğer kullanıcıların bu kuruluşa ait olduğunu, iki sütun gerekiyor. Bir organizasyon, 100 kullanıcıya sahip her kullanıcı için bu tablodaki 100 girdileri olurdu söylüyorlar.