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

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

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

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

Δημοσίευσηαπό Ilias95 » 11 Φεβ 2012, 16:24

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

Ποια/ποιες εκ των SQL, MySQL, SQLite (ή κάποια άλλη που μου διαφεύγει) χρησιμοποιείτε συχνότερα, ποια επικρατεί γενικώς, ποιες οι διαφορές τους και ποια τα πλεονεκτήματα της κάθε μίας; Κάποια καλά tutorial που θα προτείνατε σε κάποιον που δεν έχει ξανά ασχοληθεί με βάσεις δεδομένων;


Επίσης ένα πρόβλημα:

Ας πούμε ότι θέλουμε να δημιουργήσουμε έναν διευθυνσιογράφο (address book).
Στο πρόγραμμα θα καταχωρούνται επαφές και θα οργανώνονται σε κατηγορίες. Οπότε σίγουρα έχουμε δύο πίνακες στην database.
Έναν για τις κατηγορίες και έναν για τις επαφές οι οποίοι συνδέονται με many-to-one relationship (κάθε κατηγορία θα έχει πολλές επαφές και κάθε επαφή θα ανήκει σε μία μόνο κατηγορία).

Θέλουμε όμως επίσης το πρόγραμμα να είναι multi-user. Δηλαδή να μπορούν να συνδέονται διαφορετικοί χρήστες και να έχει ο καθένας τις δικές του κατηγορίες και επαφές.
Πως θα υλοποιηθεί αυτό;

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

Όπως προείπα καμία απ' τις δύο αυτές λύσεις δεν μου αρέσει.
Καμία ιδέα πως θα μπορούσε να υλοποιηθεί το παραπάνω; Ποιος είναι ο "σωστός" τρόπος;

Ευχαριστώ εκ των προτέρων.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό the_eye » 11 Φεβ 2012, 17:59

Εγώ χρησιμοποιώ για web εφαρμογές php + mysql

Για βάσεις δες "κανονικοποίηση βάσεων δεδομένων"

πχ
http://dide.flo.sch.gr/Plinet/Tutorials ... heory.html
Όσο λιγότερο κλειστό λογισμικό έχεις, τόσα λιγότερα προβλήματα.
1 Γνώσεις ⇛ Linux: Καλό ┃ Προγραμματισμός: Ναι PHP, MySQL ┃ Αγγλικά: Καλά
2 Ubuntu 24.04.2
3 Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 7836 MiB ‖ Gigabyte B150M-HD3 DDR3-CF - Gigabyte B150M-HD3 DDR3
4 Intel HD Graphics 530 [8086:1912] {i915}
5 enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
Άβαταρ μέλους
the_eye
Διαχειριστής
Διαχειριστής
 
Δημοσιεύσεις: 11726
Εγγραφή: 16 Μαρ 2010, 17:19
Launchpad: ntoulasd
IRC: the_eye_
Εκτύπωση

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

Δημοσίευσηαπό parenthesis » 11 Φεβ 2012, 18:19

Με τις ελάχιστες γνώσεις που έχω από ΒΔ (κι αυτό μόνο με MySQL), μια υλοποίηση που μου έρχεται στο μυαλό είναι στην ίδια ΒΔ να φτιάχνεις ζευγάρια πινάκων (κατηγορίες - επαφές) για τον κάθε χρήστη (αν κατάλαβα καλά πώς το εννοείς). Επίσης, θα έχεις 1 πίνακα για τους users, που θα περιέχει ας πούμε username, password, και ένα μοναδικό αναγνωριστικό. Ανάλογα με το αναγνωριστικό του χρήστη, όταν συνδέεται, θα του επιτρέπεις να έχει πρόσβαση μόνο στους πίνακες που τον αφορούν (μέσω κάποιας όψης - view).

Αυτό σκέφτηκα, δεν ξέρω αν είναι σωστή υλοποίηση. Ας περιμένουμε απάντηση κάποιου πιο έμπειρου. :mrgreen:
1 Γνώσεις Linux: Πρώτα βήματα ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Πολύ καλό
2 Dual boot:
  • Ubuntu 13.04 raring 3.8.0-34-generic 64bit (el_GR.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic
  • Fedora 19 Schrödinger’s Cat 3.13.5-101.fc19.x86_64 64bit (el_GR.utf8, gnome)
3 Intel Core i5-3337U CPU @ 1.80GHz ‖ RAM 3844 MiB ‖ TOSHIBA VCUAA - TOSHIBA SATELLITE U940
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 eth0: Realtek RTL8101E/RTL8102E Ethernet [10ec:8136] (rev 05) ⋮ wlan0: Intel Centrino Wireless-N 2230 [8086:0887] (rev c4)
Άβαταρ μέλους
parenthesis
punkTUX
punkTUX
 
Δημοσιεύσεις: 150
Εγγραφή: 06 Οκτ 2009, 22:47
Launchpad: mara_sdr
Εκτύπωση

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

Δημοσίευσηαπό Ilias95 » 11 Φεβ 2012, 18:28

@the_eye
Το έχω υπόψιν το παραπάνω link. Είχα διαβάσει από εκεί την θεωρία στο παρελθόν.
Όμως εξακολουθώ να μην μπορώ να καταλάβω πως θα γίνει.

@parenthesis
Ναι έκανα και εγώ αυτή τη σκέψη αλλά δεν νομίζω ότι θα ήταν "σωστή" μια τέτοια υλοποίηση.
(Ο αριθμός των πινάκων μέσα στην database θα αυξάνεται συνεχώς, δεδομένου ότι για κάθε χρήστη θα πρέπει να δημιουργούνται συνεχώς δύο νέοι πίνακες)
Ας περιμένουμε όπως είπες να δούμε και άλλες απαντήσεις. Γενικώς πρέπει να υπάρχει ένας standard τρόπος για όλες τις multi-user εφαρμογές.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

Δημοσίευσηαπό the_eye » 11 Φεβ 2012, 18:45

Ένας σχεδιασμός θα ήταν.

Πίνακας χρήστες
[id] [username] [password] ...

Πίνακας επαφές
[id] [όνομα] [επώνυμο] [τηλ] ...

Πίνακας αντιστοίχησης (Εδώ αντιστοιχείς ποιες επαφές βλέπει ο κάθε χρήστης)
[id] [χρήστης id] [επαφή id]

Θα έχει περιεχόμενα της μορφής
1, 1, 1
2, 1, 2
3, 1, 3
...
10, 1, 10
11, 2, 1 (εδώ μοιράζονται οι 2 χρήστες την ίδια επαφή)
12, 2, 11
13, 2, 12
...
Όσο λιγότερο κλειστό λογισμικό έχεις, τόσα λιγότερα προβλήματα.
1 Γνώσεις ⇛ Linux: Καλό ┃ Προγραμματισμός: Ναι PHP, MySQL ┃ Αγγλικά: Καλά
2 Ubuntu 24.04.2
3 Intel Core i5-6500 CPU @ 3.20GHz ‖ RAM 7836 MiB ‖ Gigabyte B150M-HD3 DDR3-CF - Gigabyte B150M-HD3 DDR3
4 Intel HD Graphics 530 [8086:1912] {i915}
5 enp1s0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)
Άβαταρ μέλους
the_eye
Διαχειριστής
Διαχειριστής
 
Δημοσιεύσεις: 11726
Εγγραφή: 16 Μαρ 2010, 17:19
Launchpad: ntoulasd
IRC: the_eye_
Εκτύπωση

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

Δημοσίευσηαπό medigeek » 11 Φεβ 2012, 19:56

Ilias95 έγραψε:Δεν υπάρχει κάποιο θέμα σχετικό με τις βάσεις δεδομένων οπότε είπα να ανοίξω ένα.

Ποια/ποιες εκ των SQL, MySQL, SQLite (ή κάποια άλλη που μου διαφεύγει) χρησιμοποιείτε συχνότερα, ποια επικρατεί γενικώς, ποιες οι διαφορές τους και ποια τα πλεονεκτήματα της κάθε μίας; Κάποια καλά tutorial που θα προτείνατε σε κάποιον που δεν έχει ξανά ασχοληθεί με βάσεις δεδομένων;


MySQL / MariaDB (GPL "community mysql") / PostgreSQL (αν θυμάμαι καλά, ήταν και είναι ακόμη open source) / Oracle database (Κλειστού κώδικα λογισμικό) - Αυτές οι βάσεις δεδομένων είναι RDBMS: http://en.wikipedia.org/wiki/Relational ... ent_system
έγραψε:A short definition of an RDBMS is: a DBMS in which data is stored in tables and the relationships among the data are also stored in tables. The data can be accessed or reassembled in many different ways without having to change the table forms.


Υπάρχει ακόμη μια κατηγορία βάσης δεδομένων εκτός από (Ο)RDBMS, αλλά δεν μπορώ να θυμηθώ το όνομα.

Οι περισσότερες RDBMS βασίζονται στη γλώσσα "SQL": http://en.wikipedia.org/wiki/SQL
Από εκεί, η καθεμιά προσθέτει τα δικά της "χαρακτηριστικά" (εντολές, μεθόδους, variables κτλ). Μπορείς να κάνεις import/export τη βάση σου από μια βάση mysql σε μια άλλη mysql. Μπορείς επίσης να κάνεις import/export τη βάση σου από σύστημα (mysql) σε σύστημα (mariadb ;; ), αν φυσικά υποστηρίζουν και οι δύο την αρχική SQL γλώσσα.

Η sqlite είναι από τις πιο γρήγορες και είναι public domain. Φορτώνει το αρχείο της βάσης την πρώτη φορά που το διαβάζει στη μνήμη (άρα την πρώτη φορά αργεί λίγο, ανάλογα με το μέγεθος της βάσης δεδομένων). Μετά όλα γίνονται στη μνήμη απ'ό,τι θυμάμαι.

έγραψε:
Θέλουμε όμως επίσης το πρόγραμμα να είναι multi-user. Δηλαδή να μπορούν να συνδέονται διαφορετικοί χρήστες και να έχει ο καθένας τις δικές του κατηγορίες και επαφές.
Πως θα υλοποιηθεί αυτό;

Αυτό δεν γίνεται στην sqlite: http://www.sqlite.org/omitted.html (GRANT / REVOKE) - το sqlite είναι βάση δεδομένων σε ένα αρχείο. Το αρχείο θα είναι readable σε όλους τους χρήστες, ο καθένας μπορεί να διαβάσει τα δεδομένα ολόκληρης της βάσης δεδομένων.

Αν επιλέξεις το sqlite, το μόνο που μπορείς να κάνεις είναι να φτιάξεις ξεχωριστές sqlite βάσεις δεδομένων για κάθε χρήστη στο ~/.config/myproject/mydb.db :)

Αν η βάση δεδομένων πρόκειται να έχει πολλά στοιχεία, πολλούς χρήστες, που αλληλοσυνδέονται μεταξύ τους, τότε επέλεξε mysql. Για την ώρα είναι ξακουστή η mysql, μέχρι που η Sun την παρέδωσε στην Oracle. Ακόμη υπάρχει ευτυχώς, αλλά το μέλλον της δεν είναι σίγουρο.
Τελευταία επεξεργασία από medigeek και 11 Φεβ 2012, 22:43, έχει επεξεργασθεί 1 φορά/ες συνολικά
Κύπριος; Κόπιασε στο 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: Βάσεις δεδομένων

Δημοσίευσηαπό medigeek » 11 Φεβ 2012, 20:02

medigeek έγραψε:
Υπάρχει ακόμη μια κατηγορία βάσης δεδομένων εκτός από (Ο)RDBMS, αλλά δεν μπορώ να θυμηθώ το όνομα.

structured storage!!
Π.χ. couchDB - δουλεύει υπό τύπο Key-value, κάτι σαν dictionary στην python, μέσω http server (πάλι αν θυμάμαι καλά).
http://en.wikipedia.org/wiki/CouchDB
http://en.wikipedia.org/wiki/Comparison ... e_software
http://wiki.apache.org/couchdb/Getting_ ... ith_Python
Κύπριος; Κόπιασε στο 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 » 11 Φεβ 2012, 21:18

Αφού θέλεις κάθε χρήστης να βλέπει μόνο τις δικές του επαφές, τότε ο πίνακας των επαφών μπορεί να έχει και τον κωδικό χρήστη στον οποίο ανήκει η επαφή. Με αυτό τον τρόπο μία επαφή ανήκει σε ένα μόνο χρήστη. Αν θέλεις η ίδια επαφή να συνδέεται με παραπάνω χρήστες θα πρέπει να προσθέσεις ένα ενδιάμεσο πίνακα, όπως ειπώθηκε παραπάνω, για να έχεις την σχέση πολλά προς πολλά.
Γνώσεις 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: Βάσεις δεδομένων

Δημοσίευσηαπό Dimitris » 11 Φεβ 2012, 21:58

@ilias: επειδή μου μυρίζει online εφαρμογή. Η λύση εξαρτάται αν ένας χρήστης θα έχει πρόσβαση στα δεδομένα άλλου χρήστη, πχ. αν συνεργάζονται;

* Αν τα δεδομένα των χρηστών είναι τελείως ανεξάρτητα τότε ο κάθε user σου θα έχει τη δική του βάση δεδομένων.

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

Δεν υπάρχει σωστός τρόπος. Και οι δύο λύσεις έχουν πλεονεκτήματα και μειονεκτήματα. Η πρώτη είναι εύκολα υλοποιήσιμη (δε χρειάζεται να κρύψεις τα δεδομένα των άλλων χρηστών) και εύκολα scalable. Στη δεύτερη δε χρειάζεσαι να αλλάζεις βάσεις δεδομένων, αλλά πρέπει να κρύψεις τα δεδομένα των άλλων χρηστών.

Οι λύσεις αυτές είναι ανεξάρτητες από το ποια βάση θα χρησιμοποιήσεις. Πάλι η κάθε βάση έχει πλεονεκτήματα και μειονεκτήματα. Για μια απλή ιστοσελίδα η sqlite είναι υπέραρκετή, θεωρώ τη MySQL overkill (προσωπική άποψη). Αν ο κάθε χρήστης έχει τη δική του βάση τότε μπορεί αυτή να είναι ένα αρχείο sqlite, και μπορεί να γίνει και εύκολα parallelized: οι πρώτοι 100 χρήστες σε ένα server, οι επόμενοι στον άλλον, και το "parallelization" γίνεται από τον apache. Αν χρησιμοποιήσεις MySQL, μπορείς να την κάνεις παράλληλη άλλα έχει πολλή περισσότερη δουλειά. Η postgresql είναι παρόμοια με την mysql, για την couchdb δε μπορώ να εκφέρω γνώμη.

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

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

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

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

Πρώτα από όλα ευχαριστώ όλους για τις απαντήσεις.

@the_eye
Αυτό με τον πίνακα αντιστοίχισης δεν το σκέφτηκα αλλά να πω την αλήθεια δεν μου αρέσει πολύ η ιδέα ότι κάθε χρήστης και κάθε επαφή (το id τους δηλαδή) θα πρέπει να περνιέται σε 2 πίνακες. Δεν θα ήταν καλύτερα να γίνει αυτό με την χρήση foreign keys; Επίσης έχεις παραλείψει στον σχεδιασμό τον πίνακα κατηγορίες. Έστω ότι θέλω να δω όλες τις κατηγορίες ενός χρήστη. Θα προσθέσω νέα στήλη στον πίνακα αντιστοίχησης; Και μετά η σχέσεις επαφών-κατηγοριών;

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

medigeek έγραψε:Αν επιλέξεις το sqlite, το μόνο που μπορείς να κάνεις είναι να φτιάξεις ξεχωριστές sqlite βάσεις δεδομένων για κάθε χρήστη στο ~/.config/myproject/mydb.db"

Δεν νομίζω ότι δεν μπορεί να γίνει αλλιώς και με sqlite.
Επίσης σε μία desktop application η επιλογή χρήστη θα γίνεται μέσα απ' το πρόγραμμα οπότε δεν θα εξαρτάται απ' τον home του χρήστη.

@Dimitris
Σκοπεύω να κάνω δύο εφαρμογές.
Μία desktop application με gui (με python και sqlite - για την ακρίβεια θα ξαναγράψω ένα παλιό πρόγραμμα) και μία web application (με python/django και sqlite πάλι).
Θα χρησιμοποιήσω την sqlite γιατί βρίσκεται στην standard library της python.

Τα δεδομένα θα είναι τελείως ανεξάρτητα. Δεν χρειάζεται να μοιράζονται επαφές οι users.
Θα με ενδιέφερε να δω την υλοποίηση και στις δύο περιπτώσεις όμως.

Το parallelization τι ακριβώς είναι; Όταν λες οι 100 πρώτοι χρήστες σε έναν server, δηλαδή 100 διαφορετικές databases, δηλαδή 100 διαφορετικά αρχεία;
Και στην περίπτωση της desktop application;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Επόμενο

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

cron