Προς το περιεχόμενο

Sql ερώτηση.


k33theod

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Είναι μια βάση που έχει φωτογραφίες. Οι φωτογραφίες ανήκουν σε πρόσωπα. Οπότε στον πίνακα φωτογραφίες έχω foreign key το person. Θέλω ο χρήστης  person να μπορεί να έχει τις foto του sorted. Δηλαδή εάν έχει ας πούμε 10 fotos να λέει αυτή είναι η 1ή αυτή η 2η κλπ. Κάποια στιγμή σβήνει την 2 ασ πούμε  τότε το σύνολο αλλάζει σε 9 και η 3 γίνεται 2 η 4η 3 κλπ. Προσθέτει μία ως 5η το σύνολο αυξάνει και η 5η γίνεται 6η klp. Και θέλω αυτά τα νούμερα να  είναι στη βάση στον ίδιο πίνακα με τις φωτο. Οπότε σκέφτηκα μήπως γίνεται με sql αλλά μου  φαίνεται σχεδόν αδύντατο.  Καμία ιδέα;

id	foto	person			id	foto	person	priority
1	foto1	1			1	foto1	1	3
2	foto2	2			2	foto2	2	1
3	foto3	3			3	foto3	3	8
4	foto4	1			4	foto4	1	7
5	foto5	2			5	foto5	2	4
6	foto6	3			6	foto6	3	5
7	foto7	1			7	foto7	1	4
8	foto8	2			8	foto8	2	5
9	foto9	3			9	foto9	3	6
10	foto10	1			10	foto10	1	6
11	foto11	2			11	foto11	2	8
12	foto12	3			12	foto12	3	4
13	foto13	1			13	foto13	1	5
14	foto14	2			14	foto14	2	7
15	foto15	3			15	foto15	3	7
16	foto16	1			16	foto16	1	8
17	foto17	2			17	foto17	2	6
18	foto18	3			18	foto18	3	3
19	foto19	1			19	foto19	1	2
20	foto20	2			20	foto20	2	3
21	foto21	3			21	foto21	3	1
22	foto22	1			22	foto22	1	1
23	foto23	2			23	foto23	2	2
24	foto24	3			24	foto24	3	2

Δηλαδή η βάση μου είναι τώρα όπως στο 1ο Πίνακα και θέλω να γίνει όπως στον 2ο. Παράδειγμα με 3 άτομα που έχει 8 φωτογραφίες ο καθένας

Επεξ/σία από k33theod
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν εννοείς ότι θες να αλλάζεις το Priority τότε θα χρειαστείς 1 trigger On Insert (όταν κάνεις εισαγωγή) και 1 trigger on Delete (Οταν διαγράφεις )

Οπότε όταν κάνεις διαγραφή Update

Όταν κάνεις εισαγωγή Update.

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

12 λεπτά πριν, masteripper είπε

Αν εννοείς ότι θες να αλλάζεις το Priority τότε θα χρειαστείς 1 trigger On Insert (όταν κάνεις εισαγωγή) και 1 trigger on Delete (Οταν διαγράφεις )

Οπότε όταν κάνεις διαγραφή Update

Όταν κάνεις εισαγωγή Update.

Performance wise δεν ξέρω αν θα είναι σωστό όμως αυτό , δλδ αν έχει 100 / 1000 φωτό θα πρέπει να τις κάνει όλες update

Εγώ θα προτιμούσα ένα απλό id autogenerated που θα γίνεται order. Όταν γίνεται delete απλά θα λείπει η εγγραφή και δεν θα χαλάει το ordering.

Τώρα το tricky είναι αν θέλεις να βάζει ο χρήστης το ordering , αλλά δεν ξέρω κατα πόσο είναι και αυτό σωστό. Αν έχει δλδ 100 φωτογραφίες και βάλει μία νέα και την θέλει πέμπτη ? Εκεί όντως θα πρέπει να κάνεις όλες τις υπόλοιπες update με +1

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1 ώρα πριν, tsofras είπε

Performance wise δεν ξέρω αν θα είναι σωστό όμως αυτό , δλδ αν έχει 100 / 1000 φωτό θα πρέπει να τις κάνει όλες update

Εγώ θα προτιμούσα ένα απλό id autogenerated που θα γίνεται order. Όταν γίνεται delete απλά θα λείπει η εγγραφή και δεν θα χαλάει το ordering.

Τώρα το tricky είναι αν θέλεις να βάζει ο χρήστης το ordering , αλλά δεν ξέρω κατα πόσο είναι και αυτό σωστό. Αν έχει δλδ 100 φωτογραφίες και βάλει μία νέα και την θέλει πέμπτη ? Εκεί όντως θα πρέπει να κάνεις όλες τις υπόλοιπες update με +1

1 δείκτη θα αλλάξει (+/-)...δεν πρόκειται να γίνει και κάτι...μιλάμε για Milliseconds

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επίσης, δεν ξέρω αν έχεις κάποιον περιορισμό στο backend σου, αλλα γιατί να μην τις κάνει indexing όταν τις τραβάς ? Είτε με βάση το id είτε με ένα πεδίο ημερομηνίας του πότε το πέρασε ο χρήστης.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που θέλω είναι ο χρήστης να μπορεί να αλλάζει το order. Δηλαδή ανεβάζω μια φωτογραφία που μου αρέσει και θέλω να έχει priority k. Η διαδικασία του χρήστη είναι upload foto και priority k.

Η διαδικασία στη συνέχεια όπως to σκέφτομαι είναι η εξής. //

Insert k

1 update fotos where priority> = k make priority+=1//σε όλα ενοείται ότι επιλέγω μόνο για τον ενδιαφερόμενο χρήστη

2 insert foto (new foto prioriti k ).

σε πείπτωση delete k

1 remove foto where priority k

2 update fotos where  priority > k make priority-=1

σε περιπτωση update foto l se k

1 update foto where priority l set priority -1//endiamesi timi

2 update fotos where priority > l set priority-=1

3 update fotos where priority >= k set priority +=1

4 update fotos where priority = -1 set priority k

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

Οπότε θα το κάνω στο backend με πιθανότητα να γίνει μ@l@k@ 99,9%  

12 ώρες πριν, tsofras είπε

Performance wise δεν ξέρω αν θα είναι σωστό όμως αυτό , δλδ αν έχει 100 / 1000 φωτό θα πρέπει να τις κάνει όλες update

Εγώ θα προτιμούσα ένα απλό id autogenerated που θα γίνεται order. Όταν γίνεται delete απλά θα λείπει η εγγραφή και δεν θα χαλάει το ordering.

Τώρα το tricky είναι αν θέλεις να βάζει ο χρήστης το ordering , αλλά δεν ξέρω κατα πόσο είναι και αυτό σωστό. Αν έχει δλδ 100 φωτογραφίες και βάλει μία νέα και την θέλει πέμπτη ? Εκεί όντως θα πρέπει να κάνεις όλες τις υπόλοιπες update με +1

Ναι δεν με καλύπτει + ότι πως θα βάλω αυτό το id στον πίνακα για κάθε user χωριστά. Οι φωτο για κάθε χρήστη δεν νομίζω να ξεπερνάνε τις 20 περίπου. Οι χρήστες είναι unlimited.

 

11 ώρες πριν, Theo1903 είπε

Επίσης, δεν ξέρω αν έχεις κάποιον περιορισμό στο backend σου, αλλα γιατί να μην τις κάνει indexing όταν τις τραβάς ? Είτε με βάση το id είτε με ένα πεδίο ημερομηνίας του πότε το πέρασε ο χρήστης.

Δεν έχω κάποιο περιορισμό. Σε πρώτη φάση που ανεβάζει κάποιος 10 φωτο px μπορώ να πω "ανέβασε τες με τη σειρά που θες". Μετά τι γίνεται με updates deletes new inserts

 

13 ώρες πριν, archer100 είπε

Χωρις να ειμαι εξπερ στην sql, θα πονταρα οτι ειναι πιο εφικτο να γινει με εξελ?

Δεν παίζει τέτοια λύση. Η βάση τρέχει ήδη σε mysql

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

13 ώρες πριν, masteripper είπε

1 δείκτη θα αλλάξει (+/-)...δεν πρόκειται να γίνει και κάτι...μιλάμε για Milliseconds

O trigger που πρότεινε ο συμφορουμίτης, πολύ καλή λύση.

πχ σβήνεται η φωτο νο 5 του person 3, -> update priority=priority-1 για τις φωτο μεγαλύτεες του 5 του person 3

(δηλαδη μαχ 20 updates)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

2 ώρες πριν, morehp είπε

Το θέμα είναι ότι εδώ, την κατάταξη την ορίζει ο χρήστης, με εντελώς δικά του κριτήρια και όχι οι τιμές κάποιας άλλης στήλης.

Οι τιμές της στήλης της κατάταξης (της οποίας ο σκοπός θεωρώ ότι περιγράφεται καλύτερα με το όνομα rank και όχι το priority), δεν έχουν και τόσο σημασία, αρκεί να είναι η μία μεγαλύτερη από την άλλη. Συνεπώς, κατά το insert και delete, δεν χρειάζεται και μεγάλη μέριμνα. Μια νέα φωτο μπορεί να πάρει το MAX(rank) +1 και μετά ο χρήστης να την κατατάξει όπου θέλει, ή να πάρει την τιμή 1 και να αυξηθούν οι άλλες κατά 1, αναλόγως την ταξινόμηση.

Νομίζω πως περισσότερη δουλειά απαιτείται στο front end ώστε να ανιχνεύεται η κατεύθυνση της επιθυμητής κατάταξης της επιλεγμένης φωτογραφίας και να καλούνται τα SQL updates τα οποία, μάλλον, φτάνει να εκτελούν ένα απλό swap της επιλεγμένης rank με την αμέσως μεγαλύτερη ή αμέσως μικρότερη τιμή της, για κάθε βήμα κατάταξης.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αφού σε νοιάζει η σχετική τους σειρά, κράτα μόνο ποια είναι πριν και ποια μετά. Δηλαδή, βάλε στην ένα table που θα κρατάει τρεις στήλες, μία για το ID του item, μία για το ID του item που είναι πριν, και μία για το ID του item που είναι μετά.

Όταν εισάγεις νέο ή διαγράφεις ένα item, αλλάζεις μόνο τα δύο items που είναι πριν και μετά.

Εφόσον ο χρήστης θα βλέπει τα items τότε θα μπορείς να τα κάνεις query βάσει του ID τους.

Δηλαδή:

  • Ο χρήστης θέλει να εισάγει νέο item μετά το item X ή να διαγράψει ένα υφιστάμενο item Y
  • Εάν είναι για εισαγωγή, κάνεις query το item X βάσει του ID του από το table και βλέπεις ποιο item είναι μετά, έστω το item Z. Αλλάζεις το ποιο item είναι μετά στο item X και ποιο item είναι πριν στο item Z
  • Εάν είναι για διαγραφή, βλέπεις ποια items είναι πριν και μετά, και πας και τα «ενώνεις». 
     

 

Τα παραπάνω θέλουν μόνο τρεις αλλαγές στην βάση για εισαγωγή και διαγραφή, συν μία την actual εισαγωγή/διαγραφή. 

Υ.Γ. Στην ουσία, η κλάση σου για το table με τις συσχετίσεις θα είναι μία double linked list. Οι μέθοδοι της κλάσης θα υλοποιούν τις λειτουργίες της double linked list.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 28/2/2022 στις 10:14 ΠΜ, k33theod είπε

Η διαδικασία στη συνέχεια όπως to σκέφτομαι είναι η εξής. //

Insert k

1 update fotos where priority> = k make priority+=1//σε όλα ενοείται ότι επιλέγω μόνο για τον ενδιαφερόμενο χρήστη

2 insert foto (new foto prioriti k ).

σε πείπτωση delete k

1 remove foto where priority k

2 update fotos where  priority > k make priority-=1

σε περιπτωση update foto l se k

1 update foto where priority l set priority -1//endiamesi timi

2 update fotos where priority > l set priority-=1

3 update fotos where priority >= k set priority +=1

4 update fotos where priority = -1 set priority k

 

 

Παράθεση για να δεις το από πάνω. 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

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

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...