SitePoint Sponsor

User Tag List

Results 1 to 2 of 2
  1. #1
    SitePoint Guru whisher's Avatar
    Join Date
    May 2006
    Location
    Kakiland
    Posts
    732
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Composite primary key schema

    Hi,
    for a photo contest I've set up this schema
    PHP Code:
    CREATE TABLE IF NOT EXISTS pc_contest (
        
    id INT UNSIGNED NOT NULL auto_increment,
        
    title VARCHAR(255NOT NULL,
        
    slug VARCHAR(255NOT NULL,
        
    description TEXT DEFAULT NULL,
        
    valid_from DATE NOT NULL,
        
    valid_to DATE NOT NULL,
        
    create_date DATE NOT NULL,
        
    max_n_pictures TINYINT DEFAULT 1 COMMENT 'max number of pictures allowed in the contest',
        
    login_type TINYINT DEFAULT 1 COMMENT '1 only fb login,2 fb login + registration,3 only registration',
        
    picture_moderation TINYINT(1) DEFAULT 0 COMMENT '1 all the pictures should be moderate before publishing',
        
    status TINYINT(1) DEFAULT 0 COMMENT '0 unactive 1 active',
        
    header VARCHAR(255) DEFAULT NULL,
        
    PRIMARY KEY  (id),
        
    UNIQUE KEY unique_pc_contest_title (title),
        
    UNIQUE KEY unique_pc_contest_slug (slug)
     ) 
    ENGINE=InnoDB  DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS pc_contestant (
        
    contest_id INT UNSIGNED NOT NULL,
        
    user_fb_id BIGINT UNSIGNED DEFAULT NULL,
        
    firstname VARCHAR(255NOT NULL,
        
    surname VARCHAR(255NOT NULL,
        
    email VARCHAR(255NOT NULL,
        
    join_datetime DATETIME NOT NULL,
        
    join_ip VARCHAR(15NOT NULL,
        
    hash VARCHAR(40NOT NULL,
        
    PRIMARY KEY  (contest_id,email),
        
    KEY pc_contestant_hash (hash)
    ENGINE=InnoDB  DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS pc_album(
        
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        
    contest_id INT UNSIGNED NOT NULL,
        
    contestant_email VARCHAR(255NOT NULL,
        
    picture VARCHAR(255NOT NULL,
        
    visible TINYINT(1) DEFAULT 0 COMMENT '1 yes 0 no',
        
    PRIMARY KEY (`id`)
    ENGINE=InnoDB DEFAULT CHARSET=utf8
    I'm wondering if it's better using
    PRIMARY KEY (contest_id,email)
    in pc_contestant or it's better
    to set like
    PHP Code:
    CREATE TABLE IF NOT EXISTS pc_contest (
        
    id INT UNSIGNED NOT NULL auto_increment,
        
    title VARCHAR(255NOT NULL,
        
    slug VARCHAR(255NOT NULL,
        
    description TEXT DEFAULT NULL,
        
    valid_from DATE NOT NULL,
        
    valid_to DATE NOT NULL,
        
    create_date DATE NOT NULL,
        
    max_n_pictures TINYINT DEFAULT 1 COMMENT 'max number of pictures allowed in the contest',
        
    login_type TINYINT DEFAULT 1 COMMENT '1 only fb login,2 fb login + registration,3 only registration',
        
    picture_moderation TINYINT(1) DEFAULT 0 COMMENT '1 all the pictures should be moderate before publishing',
        
    status TINYINT(1) DEFAULT 0 COMMENT '0 unactive 1 active',
        
    header VARCHAR(255) DEFAULT NULL,
        
    PRIMARY KEY  (id),
        
    UNIQUE KEY unique_pc_contest_title (title),
        
    UNIQUE KEY unique_pc_contest_slug (slug)
     ) 
    ENGINE=InnoDB  DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS pc_contestant (
        
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        
    contest_id INT UNSIGNED NOT NULL,
        
    user_fb_id BIGINT UNSIGNED DEFAULT NULL,
        
    firstname VARCHAR(255NOT NULL,
        
    surname VARCHAR(255NOT NULL,
        
    email VARCHAR(255NOT NULL,
        
    join_datetime DATETIME NOT NULL,
        
    join_ip VARCHAR(15NOT NULL,
        
    hash VARCHAR(40NOT NULL,
        
    PRIMARY KEY  (id),
        
    KEY pc_contestant_hash (hash)
    ENGINE=InnoDB  DEFAULT CHARSET=utf8;

    CREATE TABLE IF NOT EXISTS pc_album(
        
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        
    contestant_id INT UNSIGNED NOT NULL,
        
    picture VARCHAR(255NOT NULL,
        
    visible TINYINT(1) DEFAULT 0 COMMENT '1 yes 0 no',
        
    PRIMARY KEY (`id`)
    ENGINE=InnoDB DEFAULT CHARSET=utf8
    pc_album is 1:n

    Thanks in advance
    Bye

  2. #2
    SQL Consultant gold trophysilver trophybronze trophy
    r937's Avatar
    Join Date
    Jul 2002
    Location
    Toronto, Canada
    Posts
    39,016
    Mentioned
    53 Post(s)
    Tagged
    2 Thread(s)
    Quote Originally Posted by whisher View Post
    I'm wondering if it's better using
    PRIMARY KEY (contest_id,email)
    in pc_contestant
    not necessarily

    if pc_contestant is referenced elsewhere, then yes

    but don't forget UNIQUE(contest_id,email) if you do decide to use an auto_increment
    r937.com | rudy.ca | Buy my SitePoint book: Simply SQL
    "giving out my real stuffs"


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •