Автор Тема: Изготвяне на база данни - създаване на таблици, нормализиране.  (Прочетена 2464 пъти)

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Имам желанието да напиша софтуер за отрязяване на спортно съзтезание. Идеята ми е да се вкарват съзтезателите в началото на годината и после само да се допълват. И да се указва дали съзтезателя от даден клуб ще участва на това съзтезание или не. По-надолу съм го разписал като текст, по-късно ще се опитам да създам някаква база и вие да кажете своето мнение. Имам желанието да го направя и на MySQL и на PostgresSQL. С първата съм работил, с втората по-малко но вярвам че е по-лесно. Искам всичко да е UTF-8, фронтенда може да е Apache-PHP, OOo или Delphi. Но нека да изчистим една база и тогава на нея отгоре по-лесно ще се строи. Ето какво имам като изходящо-входящи данни за едно съзтезание. Както казах, малко по късно ще пусна примерна база и ще моля да я нормализираме заедно.

- Писменно описание на какво имаме на едно съзтезание -

Състезание, то има:
отделни категории в които филтрирани и селектирани съзтезатели се борят за 123 и 4 място
контакти: тел, имейл, адрес
допълнителна информация

Категориите филтрират и селектират съзтезателите по:
възраст
пол
контакти: тел, имейл, адрес
степен в карате
вид на категорията: ката индивидуално, кумите индивидуално
категориите имат два вида свършек с по един човек на първо и второ място и двама на трето. И втори случай с репешажи, с по един човек в 1-во, 2-ро, 3-то и 4-то място
категории са до 8, 16, 32 и 64 човека. За препоръчване е да се правят по малки категории, да има две категории по 16 или 32 човека и да се дават повече медали.

Съзтезателите имат:
възраст
пол
степен в карате
контакти: тел, имейл, адрес
желание да участват в категория/нежелание – могат да присъстват в базата но да не се селектират за участие
клуб към който членуват
допълнителна информация

Клуба има:
контакти: тел, имейл, адрес
треньор
помощник треньор
допълнителна информация

Треньор и помощник треньора имат:
възраст
пол
степен в карате
контакти: тел, имейл, адрес
клуб към който членува
допълнителна информация

Оттука следва, че каратистите имат:
възраст: 4-99
пол:м, ж
степен в карате 9к, 8к... 1к, 1д, 2д, 3д...
контакти: тел, имейл, уеб сайт, скайп, ICQ, адрес
желание/нежелание да участват в съзтезанието: автоматично поставяне в категориите
клуб към който членуват: падащо меню с клубовете
какъв вид е каратиста: съзтезател, треньор, помощник треньор, и неучастващ в съзтезанието, но и треньорите могат да участват в съзтезанието
допълнителна информация

оттук следва че предварително трябва да е въведен клуба:
контакти: тел, имейл, уеб сайт, скайп, ICQ, адрес
допълнителна информация
връзката клуб<->треньор и клуб<->съзтезател се прави при „каратистите“
Активен

bop_bop_mara

  • Напреднали
  • *****
  • Публикации: 2433
  • Distribution: Debian Testing
  • Window Manager: LXDE
  • Cute and cuddly
    • Профил
Здрасти. На мен силата не ми е в базите данни, но за университетския курс ни препоръчаха книгата Database Systems: The Complete Book на Hector Garcia-Molina. Вътре има много добре обяснено как да си проектираме базата (на хартия и към релационния модел), как да я нормализираме и т.н. Ако можеш да я намериш тази книжка отнякъде, има какво да се научи.
Активен

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
Код
GeSHi (SQL):
  1. CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  2.  
  3. CREATE TABLE `test2`.`karateka` (
  4. `id_karateka` INT UNSIGNED NOT NULL,
  5. `name` TINYTEXT NOT NULL,
  6. `pol` ENUM( 'm', 'f' ) NOT NULL DEFAULT 'm',
  7. `rajdane` DATE NOT NULL,
  8. `stepen` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ) NOT NULL DEFAULT '9k',
  9. `type` ENUM( '1', '2', '3', '4' ) NOT NULL DEFAULT '1' COMMENT '1 - sastezatel, 2 - trenior, 3 - pomostnik trenior, 4 - sekretar',
  10. `id_contact` INT UNSIGNED NOT NULL ,
  11. `id_club` INT UNSIGNED NOT NULL ,
  12. PRIMARY KEY ( `id_karateka` )
  13. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  14.  
  15. CREATE TABLE `test2`.`club` (
  16. `id_club` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  17. `name` TINYTEXT NOT NULL ,
  18. `id_contact` INT UNSIGNED NOT NULL
  19. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  20.  
  21. CREATE TABLE `test2`.`contact` (
  22. `id_contact` INT UNSIGNED NOT NULL ,
  23. `tel1` VARCHAR(20) NULL ,
  24. `tel2` VARCHAR(20) NULL ,
  25. `email` VARCHAR(20) NULL ,
  26. `skype` VARCHAR(20) NULL ,
  27. `icq` VARCHAR(20) NULL ,
  28. `address` TINYTEXT NULL ,
  29. `info` TINYTEXT NULL ,
  30. PRIMARY KEY ( `id_contact` )
  31. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  32.  
  33. CREATE TABLE `test2`.`competition` (
  34. `id_competition` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  35. `name` TINYTEXT NOT NULL ,
  36. `data` DATE NOT NULL,
  37. `id_contact` INT UNSIGNED NOT NULL
  38. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  39.  
  40. CREATE TABLE `test2`.`category` (
  41. `id_category` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  42. `id_competition` INT UNSIGNED NOT NULL,
  43. `name` TINYTEXT NOT NULL ,
  44. `min_age` TINYINT(100) UNSIGNED,
  45. `max_age` TINYINT(100) UNSIGNED,
  46. `min_rank` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ),
  47. `max_rank` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ),
  48. `pol` ENUM( 'm', 'f', 'mf' ) NOT NULL DEFAULT 'm'
  49. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  50.  
Това е което съм измислил за един ден, може би трябва да се направи външно свързване между играчите и категориите. Мисля да го допълня с нова таблица "участващи играчи" производна на karateka но само с играчите от заявката която е подал клуба за това съзтезание. И се вързват дата на съзтезание-дата на раждане на играча  = години на играча, и така се вадят играчите които ще участват от клуба. И вече тази таблица на "участващите играчи" може с външно свързване или вътрешно ще се върже с категориите на съзтезанието.

Трудно е за обяснение, като взема да го правя ще видим дали е добре.
« Последна редакция: Sep 15, 2009, 23:33 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Горе-долу бива :)

Според "скромният" ми опит ти трябва и категории по килограми, освен по години ;)

Изнасянето на цялата информация за контактите в отделна таблица може би не е нужно - това си е информация неразривно свързана с обектите от другите таблици.

Edit: Чак сега видях, че имаш връзката  competition-category в category.
« Последна редакция: Sep 15, 2009, 23:46 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

a_panov

  • Напреднали
  • *****
  • Публикации: 62
    • Профил
За последно много  мислене му хвърлих и стигнах до тука. Още не съм получил формулярите за оценяване на ката и кумите за да им видя атрибутите. Така че на този етап таблиците category_kat и category_kum са примерни с това което зная че се изисква. а1-6 и s1-6 това са оценките на Ака и Широ. Може би някъде ще трябва да се сложи поле за заключване, тоест с enum и "y" и "n" софтуера да знае дали може да променя реда или не. Но това е на по-късен етап, сега трябва са се опишат релациите-връзки между обработваните данни. Чакам отзиви!
Код
GeSHi (SQL):
  1. CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  2.  
  3. CREATE TABLE `test2`.`contact` (
  4. `id_contact` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `tel1` VARCHAR(20) NULL ,
  6. `tel2` VARCHAR(20) NULL ,
  7. `email` VARCHAR(20) NULL ,
  8. `skype` VARCHAR(20) NULL ,
  9. `icq` VARCHAR(20) NULL ,
  10. `address` TINYTEXT NULL ,
  11. `info` TINYTEXT NULL ,
  12. PRIMARY KEY ( `id_contact` )
  13. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  14.  
  15. CREATE TABLE `test2`.`karateka` (
  16. `id_karateka` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  17. `name` TINYTEXT NOT NULL,
  18. `pol` ENUM( 'm', 'f' ) NOT NULL DEFAULT 'm',
  19. `rajdane` DATE NOT NULL,
  20. `kilogrami` TINYINT UNSIGNED,
  21. `stepen` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ) NOT NULL DEFAULT '9k',
  22. `type` ENUM( '1', '2', '3', '4' ) NOT NULL DEFAULT '1' COMMENT '1 - sastezatel, 2 - trenior, 3 - pomostnik trenior, 4 - sekretar',
  23. `id_contact` INT UNSIGNED,
  24. `id_club` INT UNSIGNED NOT NULL,
  25. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  26.  
  27. CREATE TABLE `test2`.`club` (
  28. `id_club` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  29. `name` TINYTEXT NOT NULL,
  30. `id_contact` INT UNSIGNED
  31. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  32.  
  33. CREATE TABLE `test2`.`competition` (
  34. `id_competition` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  35. `name` TINYTEXT NOT NULL ,
  36. `data` DATE NOT NULL,
  37. `id_contact` INT UNSIGNED
  38. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  39.  
  40. CREATE TABLE `test2`.`category` (
  41. `id_category` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  42. `id_competition` INT UNSIGNED NOT NULL,
  43. `name` TINYTEXT NOT NULL ,
  44. `kat_kum` ENUM('kat', 'kum') NOT NULL,
  45. `min_age` TINYINT(100) UNSIGNED,
  46. `max_age` TINYINT(100) UNSIGNED,
  47. `max_kilogrami` TINYINT UNSIGNED,
  48. `min_rank` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ),
  49. `max_rank` ENUM( '9k', '8k', '7k', '6k', '5k', '4k', '3k', '2k', '1k', '1d', '2d', '3d', '4d', '5d', '6d', '7d', '8d', '9d' ),
  50. `pol` ENUM( 'm', 'f', 'mf' ) NOT NULL DEFAULT 'm'
  51. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  52.  
  53. CREATE TABLE `test2`.`karatekas` (
  54. `id_karateka` INT UNSIGNED NOT NULL,
  55. `id_category` INT UNSIGNED NOT NULL,
  56. PRIMARY KEY (`id_karateka`, `id_category`)
  57. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  58.  
  59. CREATE TABLE `test2`.`category_kat` (
  60. `category_kat` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  61. `id_category` INT UNSIGNED NOT NULL,
  62. `game` INT UNSIGNED NOT NULL,
  63. `a_id_karateka` INT UNSIGNED,
  64. `s_id_karateka` INT UNSIGNED,
  65. `winner` INT UNSIGNED,
  66. `a1` REAL(2, 1),
  67. `a2` REAL(2, 1),
  68. `a3` REAL(2, 1),
  69. `a4` REAL(2, 1),
  70. `a5` REAL(2, 1),
  71. `a6` REAL(2, 1),
  72. `s1` REAL(2, 1),
  73. `s2` REAL(2, 1),
  74. `s3` REAL(2, 1),
  75. `s4` REAL(2, 1),
  76. `s5` REAL(2, 1),
  77. `s6` REAL(2, 1)
  78. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  79.  
  80. CREATE TABLE `test2`.`category_kum` (
  81. `category_kum` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  82. `id_category` INT UNSIGNED NOT NULL,
  83. `game` INT UNSIGNED NOT NULL,
  84. `a_id_karateka` INT UNSIGNED,
  85. `s_id_karateka` INT UNSIGNED,
  86. `winner` INT UNSIGNED
  87. ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;
  88.  

Може да ми пишете и в блога ми на http://www.karatebulgaria.com/alex
« Последна редакция: Sep 21, 2009, 13:30 от VladSun »
Активен