Suggested SQL tables -------------------- CREATE TABLE GuildRoster_User ( id INTEGER UNSIGNED PRIMARY KEY, userName VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL ); CREATE TABLE GuildRoster_Character ( id INTEGER UNSIGNED PRIMARY KEY, userId INTEGER UNSIGNED NULL REFERENCES GuildRoster_User.id ON DELETE SET NULL, serverId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Server.id ON DELETE CASCADE, name VARCHAR(30) NOT NULL, class ENUM ('Druid', 'Hunter', 'Mage', 'Paladin', 'Priest', 'Rogue', 'Shaman', 'Warlock', 'Warrior'), race ENUM ('Dwarf', 'Gnome', 'Human', 'Nightelf', 'Orc', 'Tauren', 'Troll', 'Undead'), level INTEGER UNSIGNED NOT NULL DEFAULT 1 ); CREATE TABLE GuildRoster_Tradeskill { id INTEGER UNSIGNED PRIMARY KEY, name VARCHAR(255) NOT NULL, ); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Alchemy'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Blacksmithing'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Cooking'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Enchanting'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Engineering'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('First Aid'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Fishing'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Herbalism'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Leatherworking'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Mining'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Poisons'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Skinning'); INSERT INTO GuildRoster_Tradeskill (name) VALUES ('Tailoring'); CREATE TABLE GuildRoster_CharacterTradeskill ( characterId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Character.id ON DELETE CASCADE, tradeskillId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Tradeskill.id ON DELETE CASCADE, skill INTEGER UNSIGNED NOT NULL, PRIMARY KEY (characterId, tradeskillId) ); CREATE TABLE GuildRoster_Recipe { id INTEGER UNSIGNED PRIMARY KEY, name VARCHAR(255) NOT NULL, tradeskillId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Tradeskill.id ON DELETE CASCADE, skillRequired INTEGER NOT NULL, url VARCHAR(255) NULL DEFAULT NULL }; CREATE TABLE GuildRoster_CharacterRecipe ( characterId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Character.id ON DELETE CASCADE, recipeId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Recipe.id ON DELETE CASCADE, PRIMARY KEY (characterId, recipeId) ); Explanation ----------- GuildRoster_CharacterTradeskill is a "map table" between characters and their tradeskills, but contains the characters skill level with the tradeskill. GuildRoster_CharacterRecipe is a "map table" between characters and their recipes. GuildRoster_Recipe.url is an link to an external website (ThottBot) for more info about the item You *could* add the ingredients of recipes, but there's no need to, since ThottBot will prolly have this, and it would probably be too much data. Extra ----- CREATE TABLE GuildRoster_Talent ( id INTEGER UNSIGNED PRIMARY KEY, name VARCHAR(255) NOT NULL, maxRanks TINYINT UNSIGNED NOT NULL DEFAULT 1 ); CREATE TABLE GuildRoster_CharacterTalentAllocation ( characterId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Character.id ON DELETE CASCADE, talentId INTEGER UNSIGNED NOT NULL REFERENCES GuildRoster_Talent.id ON DELETE CASCADE, ranks TINYINT UNSIGNED NOT NULL DEFAULT 1 ); CREATE TABLE GuildRoster_Equipment { id INTEGER UNSIGNED PRIMARY KEY, name VARCHAR(255) NOT NULL, slot ENUM ('Head', 'Neck', 'Shoulder', 'Back', 'Chest', 'Shirt', 'Tabard', 'Wrist', 'Hands', 'Waist', 'Legs', 'Feet', 'Finger', 'Trinket', 'MainHand', 'SecondaryHand', 'Ranged'), levelRequired INTEGER UNSIGNED NOT NULL, url VARCHAR(255) NULL DEFAULT NULL }; CREATE TABLE GuildRoster_CharacterEquipment ( characterId INTEGER UNSIGNED NOT NULL PRIMARY KEY REFERENCES GuildRoster_Character.id ON DELETE CASCADE, slotHead INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotNeck INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotShoulder INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotBack INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotChest INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotShirt INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotTabard INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotWrist INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotHands INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotWaist INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotLegs INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotFeet INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotFinger0 INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotFinger1 INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotTrinket0 INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotTrinket1 INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotMainHand INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotSecondaryHand INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL, slotRanged INTEGER UNSIGNED NULL REFERENCES GuildRoster_Equipment.id ON DELETE SET NULL );