Βάσεις δεδομένων

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Βάσεις δεδομένων

Δημοσίευσηαπό Ilias95 » 12 Φεβ 2012, 01:41

Επίσης σκέφτηκα και μία ακόμα λύση με μία μόνο database.

Τρεις πίνακες: Users, Categories, Contacts.
Οι πίνακες users+categories, και categories+contacts είναι συνδεδεμένοι με many-to-one relationship (η πρώτη σχέση: κάθε user έχει πολλές κατηγορίες, αλλά κάθε κατηγορία ανήκει σε έναν μόνο user, και η δεύτερη: κάθε κατηγορία έχει πολλές επαφές αλλά κάθε επαφή μία μόνο κατηγορία).

Έτσι έχοντας μόνο 3 πίνακες (χωρίς επιπλέον για αντιστοιχήσεις) μπορούμε να δούμε η κάθε κατηγορία σε ποιον χρήστη ανήκει (απ' το foreign key) και αντίστοιχα η κάθε επαφή σε ποιον χρήστη ανήκει (απ' το foreign key βλέπουμε πρώτα σε ποια κατηγορία ανήκει, και μετά βλέπουμε η κατηγορία σε ποιον χρήστη ανήκει).

Αν θέλουμε να δούμε όλες τις επαφές του χρήστη τότε θα πρέπει να δούμε μόνο τις επαφές των κατηγοριών που ανήκουν στον χρήστη. Δηλαδή δεν πάμε κατευθείαν απ' τον χρήστη στις επαφές, αλλά περνάμε πρώτα απ' τις κατηγορίες του χρήστη.

Είναι "σωστό" ένα τέτοιο μοντέλο;

Α και μια ακόμα απορία.
Όπως είπαμε υπάρχουν δύο τρόποι. Πολλές βάσεις δεδομένων (μία για κάθε χρήστη), ή μονάχα μία.
Λογικά σε περιπτώσεις που μιλάμε για τεράστιους όγκους δεδομένων η πρώτη λύση θα είναι πιο γρήγορη;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό medigeek » 12 Φεβ 2012, 03:54

Ilias95 έγραψε:
Πριν κάνεις edit το post σου διάβασα ότι η sqlite συγκεκριμένα κρατάει την βάση σε ένα αρχείο. Οι υπόλοιπες πως λειτουργούν;


Εννοούσα πως το sqlite δημιουργεί ένα μόνο αρχείο το οποίο μπορείς να κάνεις copy-paste εύκολα και οπουδήποτε.
Η mysql πρέπει να γίνει compile και αποτελείται από ένα ολόκληρο σύστημα αρχείων. Δε θυμάμαι πού ακριβώς βρίσκονται τα αρχεία με τις βάσεις δεδομένων, υπολογίζω πως πρέπει να είναι στο /var/lib/mysql/

Ilias95 έγραψε:Δεν νομίζω ότι δεν μπορεί να γίνει αλλιώς και με sqlite.

Ναι αλλά αν τα άλλα άτομα μπορούν να βλέπουν τα αρχεία των άλλων χωρίς περιορισμούς, είναι security vulnerability.
Η sqlite δεν έχει GRANT/REVOKE εντολές, δεν μπορείς να πεις στη βάση δεδομένων "δώσε/μην δώσεις προνόμια στον τάδε χρήστη για να διαβάσει τα τάδε στοιχεία". Έχει δημιουργηθεί επίτηδες έτσι, γι' αυτό και είναι ~600kb βιβλιοθήκη.

MySQL vs SQLite:
http://stackoverflow.com/questions/3630/sqlite-vs-mysql
http://www.sqlite.org/whentouse.html

..Και ορίστε ακόμη 2 ΒΔ, εδώ εμφανίζει τι υποστηρίζουν και τι όχι:
http://database-management-systems.find ... -vs-SQLite
http://database-management-systems.find ... PostgreSQL
http://wiki.python.org/moin/Firebird

έγραψε:Λογικά σε περιπτώσεις που μιλάμε για τεράστιους όγκους δεδομένων η πρώτη λύση θα είναι πιο γρήγορη;

Η sqlite δεν φτιάχτηκε για μια ογκώδης βάση δεδομένων. Δεν ξέρω ακριβώς το όριο, αλλά σίγουρα θα αρχίσει να καταναλώνει αρκετή μνήμη η sqlite μετά από κάποιο βαθμό. Η sqlite φτιάχθηκε με σκοπό την ευκολία διαχείρισης και όσο γίνεται πιο μικρό μέγεθος. php/python/c/c++ + sqlite είναι απίθανος συνδυασμός.
Αν μιλάμε για ιστοσελίδα με high bandwidth/volume, τότε θες ένα server για τη βάση δεδομένων κι ένα server για την ιστοσελίδα.
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό Dimitris » 12 Φεβ 2012, 13:20

Ωραία από τη στιγμή που θα έχεις ανεξάρτητα δεδομένα για κάθε χρήστη, θα πρότεινα ανεξάρτητες βάσεις δεδομένων για κάθε χρήστη, είτε στην περίπτωση MySql είτε στην sqlite. Στην sqlite απλά θα έχεις πολλά αρχεία, ένα για κάθε χρήστη. Θα μιλήσω για τις server εφαρμογές μιας και για desktop εφαρμογές δεν έχω εμπειρία. Κάθε χρήστης θα τρέχει ένα instance του προγράμματός σου (μέσω apache ή όποιου άλλου server) και θα έχει μία βάση δεδομένων. Έτσι η αρχιτεκτονική θα είναι πλήρως decoupled, kαι θα μπορείς να τρέχεις το πρόγραμμα του ενός χρήστη σε έναν υπολογιστή και του άλλου σε άλλον.

Ας υποθέσουμε ότι ο υπολογιστής σου μπορεί να σηκώσει 10 χρήστες και η εφαρμογή σου αρχίζει και γίνεται δημοφιλής, οπότε αποκτάει 20 χρήστες. Τότε θα αρχίσει να γίνεται αργή αν συνεχισει να λειτουργεί στον ίδιο υπολογιστή. Ή θα πρέπει να πάρεις μεγαλύτερο υπολογιστή ή δεύτερο ίδιο. Φυσικά μπορείς θεωρητικά να παίρνεις πάντα μεγαλύτερο υπολογιστή αλλα στην πράξη υπάρχει κάποιο όριο. Αρα θα πρέπει να μοιράσεις τα δεδομένα σου σε περισσότερους υπολογιστές. Αυτό είναι το parallelization. Με την παραπάνω αρχιτεκτονική έχεις τους 10 πρώτους χρήστες στον Η/Υ 1, τους επόμενους 10 στον Η/Υ 2, κλπ. Η επιλογή του κατάλληλου server γίνεται από τον apache με κάποια ρύθμιση.

Εγώ είμαι υπέρμαχος της sqlite γιατί έχει όριο μεγέθους βάσης δεδομένων 128TB και τις εφαρμογές των κοινών θνητών όπως εγώ είναι υπεραρκετα.
medigeek έγραψε:php/python/c/c++ + sqlite είναι απίθανος συνδυασμός.

Τo συνδυασμό αυτό, python+sqlite, χρησιμοποίησα σε μια desktop εφαρμογή και σε μια ιστοσελίδα ruby+sqlite χωρίς κανένα πρόβλημα.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό vasster » 12 Φεβ 2012, 14:25

"ανεξάρτητες βάσεις δεδομένων για κάθε χρήστη". Δεν είναι πρακτικό για τις προδιαγραφές σας.

Σας είπα και πριν. Βάλτε ένα πεδίο στον πίνακα των Contacts που θα παίρνει το id του User.
Κάθε πρόσβαση στον πίνακα Contacts θα γίνεται με περιορισμό π.χ. "select * from contacts where user_id=?"

Ένα παράδειγμα που συνδυάζει τους πίνακες contacts και categories οι οποίοι συνδέονται μέσω του category_id είναι :
"select b.category, a.name from contacts a join categories b on a.category_id=b.category_id where user_id=?"
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό Ilias95 » 12 Φεβ 2012, 15:14

@vasster
Αρχικώς και εγώ κάπως έτσι το σκεφτόμουν.
Μπορείς να εξηγήσεις λίγο καλύτερα την τελευταία γραμμή; "select b.category, a.name from contacts a join categories b on a.category_id=b.category_id where user_id=?"
Τι ακριβώς ζητάμε εδώ; Δεν είμαι πολύ εξοικειωμένος ακόμα με τις βάσεις. Το join keyword (;) τι ακριβώς κάνει;

Αν θες επίσης εξήγησε γιατί θεωρείς ότι δεν είναι πρακτική η λύση με τις ανεξάρτητες databases.

@medigeek
medigeek έγραψε:Ναι αλλά αν τα άλλα άτομα μπορούν να βλέπουν τα αρχεία των άλλων χωρίς περιορισμούς, είναι security vulnerability.

Πως ακριβώς θα βλέπει κάποιος τα αρχεία (εννοείς δηλ. το αρχείο της db;) άλλου χρήστη;
Έστω ότι θα είναι σε ένα μόνο αρχείο η database. Θα ήταν δύσκολο απλά να εμφανίζουμε στον κάθε χρήστη μόνο τις επαφές που του ανήκουν;
Δηλαδή αν προσπαθήσει να μεταβεί κάποιος στο λινκ μιας επαφής που δεν του ανήκει να παίρνει κάποιο error.
Εντάξει αυτό το σκέφτομαι εντελώς θεωρητικά τώρα, δεν έχω ξανά ασχοληθεί με web και δεν ξέρω κατά πόσο όλα αυτά στέκουν ή είναι εύκολα στην υλοποίηση.

@Dimitris
Λοιπόν μάλλον πρέπει να το ψάξω περισσότερο για να καταλάβω καλύτερα κάποια πράγματα που αναφέρεις, όπως ότι ο κάθε χρήστης θα τρέχει μία instance του προγράμματος.
Επίσης την web application σκεφτόμουν να την στήσω σε δικό μου server (αν τα καταφέρω να τον στήσω σωστά) για την εμπειρία.
Οπότε στην περίπτωση με τις ξεχωριστές databases δεν ξέρω τι θα γίνει με το parallelization (όχι ότι θα αποκτήσει και πάνω από 10 χρήστες :lol: ).
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό medigeek » 12 Φεβ 2012, 15:39

Για sqlite: Aν ανοίγεις τη βάση δεδομένων με μια desktop εφαρμογή και εκτελείς την εφαρμογή ως απλός χρήστης, το sqlite αρχείο θα πρέπει να είναι readable για όλους τους χρήστες. Με αυτή τη συνθήκη, ο καθένας μπορεί να κάνει copy τη βάση και να διαβάσει τα στοιχεία που εμπεριέχει. Δεν το δοκίμασα, αλλά υποθέτω είναι λογικό.
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Βάσεις δεδομένων

Δημοσίευσηαπό vasster » 12 Φεβ 2012, 17:06

@Ilias95
Στις σχεσιακές βάσεις με το join ενώνουμε δύο ή παραπάνω πίνακες χρησιμοποιώντας κάποια κοινά (συνήθως) πεδία.
Όσον αφορά τα ξεχωριστά αντίγραφα της βάσης όχι μόνο δεν είναι πρακτικό αλλά είναι και λάθος χρήση των resources του server.
Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
Ubuntu 17.04 (Zesty Zapus) 4.10.0-19-generic 64bit (en_US.UTF-8, Unity ubuntu)
Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 15915 MiB ‖ MSI H170M PRO-VDH (MS-7982) - MSI MS-7982
Intel Sky Lake Integrated Graphics [8086:1912] {i915_bpo}
enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15) ⋮ wlx784476b5edea: 148f:5370 Ralink Technology, Corp. RT5370 Wireless Adapter
vasster
punkTUX
punkTUX
 
Δημοσιεύσεις: 253
Εγγραφή: 23 Μάιος 2010, 09:51
Εκτύπωση

Προηγούμενη

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι