Δομή της Database

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
MeTaL-RoY
Δημοσιεύσεις: 67
Εγγραφή: 12 Μαρ 2003 16:58
Τοποθεσία: Athens
Επικοινωνία:

Δομή της Database

Δημοσίευση από MeTaL-RoY » 18 Φεβ 2007 15:04

Καλησπέρα,

Θέλω να γράψω μια εφαρμογή στην οποία θα κατατίθενται βιογραφικά χρηστών. Με ενδιαφέρει το βέλτιστο αποτέλεσμα ώστε να επιβαρύνω στο ελάχιστο δυνατό το σύστημα με τις αναζητήσεις.

Ένα παράδειγμα τις δομής της βάσης όπως την σχεδιάζω είναι:

Table1
Id(auto increased, όχι primary)
Username(primary)
Password
Όνομα
Επίθετο (index)
Πόλη (index)
Ημερομηνία Γεννησης (index)

Table2
ID(αντιστοίχηση 1-1 με τον προηγούμενο πίνακα, primary)
Mail
Phone
Address
Aboutme(500chars)
Website
Κλπ στοιχεία…

Είναι σωστό να χωρίσω την βάση σε 2 πίνακες κατά αυτόν τον τρόπο; Δεδομένο του ότι οι αναζητήσεις θα γίνονται κυρίως στον πρώτο πίνακα και στη συνέχεια ο χρήστης θα επιλέγει να δει τα profiles (από table2) που ταιριάζουν στην αναζήτηση.

Ευχαριστώ εκ τον προτέρων για το χρόνο που θα αφιερώσουν όσοι βοηθήσουν :)

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Δομή της Database

Δημοσίευση από ThyClub » 18 Φεβ 2007 21:54

Θα σου προτείνω να δημιουργήσεις μερικά ακόμη tables:

Κώδικας: Επιλογή όλων

CREATE TABLE `cities` (
  `id` int(11) NOT NULL auto_increment,
  `city_name` varchar(250) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM DEFAULT CHARSET=greek COLLATE=greek_general_ci AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `cities`
-- 


-- --------------------------------------------------------

-- 
-- Table structure for table `userinfo`
-- 

CREATE TABLE `userinfo` (
  `id` int(11) NOT NULL auto_increment,
  `uid` int(11) NOT NULL default '0',
  `mail` varchar(250) NOT NULL default '',
  `phone` int(10) NOT NULL default '0',
  `address` varchar(250) NOT NULL default '',
  `aboutme` tinytext NOT NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM DEFAULT CHARSET=greek COLLATE=greek_general_ci AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `userinfo`
-- 


-- --------------------------------------------------------

-- 
-- Table structure for table `users`
-- 

CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(250) NOT NULL default '',
  `password` varchar(32) NOT NULL default '',
  `name` varchar(250) NOT NULL default '',
  `last_name` varchar(250) NOT NULL default '',
  `birthdate` varchar(32) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM DEFAULT CHARSET=greek COLLATE=greek_general_ci AUTO_INCREMENT=1 ;

Μπορείς να το κάνεις πολύ καλύτερο. Απλά όσο περισσότερη κανονικοποίηση τόσο καλύτερα.

Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Δομή της Database

Δημοσίευση από cherouvim » 18 Φεβ 2007 22:56

Νομίζω οτι έχει νόημα (για λόγους ταχύτητας) να σπάσεις σε 2 tables μόνο εάν το 1ο έχει fixed length πεδία.
Προσωπικά τα πεδία που έδωσες θα τα έκανα 1 table.

Άβαταρ μέλους
MeTaL-RoY
Δημοσιεύσεις: 67
Εγγραφή: 12 Μαρ 2003 16:58
Τοποθεσία: Athens
Επικοινωνία:

Δομή της Database

Δημοσίευση από MeTaL-RoY » 18 Φεβ 2007 23:02

από όσο έχω διαβάσει οι αναζητήσεις σε fixed tables είναι πολύ πιο γρήγορες. Γενικά η φύση των δεδομένων μου δίνει την δυνατότητα να τα κάνω όλα fixed ακόμα και αν μεγαλώσει λίγο παραπάνω η κάθε εγγραφή.

Στη πραγματικότητα αυτό που με ενδιαφέρει είναι αποκλειστικά η ταχύτητα.

οπότε τι προτείνετε 2 tables ή 1? Νομίζω ότι 1 θα είναι πιο γρήγορο αν έχω fixed τισ εγγραφές. τι λετε?:)

Κάτι ακόμα προσανατολιζόμουν σε InnoDB(αν και χάνω σε ταχύτητα) όχι MyISAM DEFAULT CHARSET=greek COLLATE=greek_general_ci για να μην έχω πρόβλημα όταν πολλοί χρήστες γράφουν στη βάση και άλλοι διαβάζουν.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες