PHP - zawsze unikalny alias w bazie tworzony automatycznie

0

Hej, przy dodawaniu elementów do bazy chciałbym alby alias tworzył się automatycznie i zawsze był unikalny.
Zasadniczo, nie jest do problemem jednak jeśli mamy kilka razy powiedzmy tytuł Pierwszy.
najpierw zrobi z tego 'pierwszy' jednak dalej zablokuje bo będzie brak unikalności. System powinien dodawać odpowiednio pierwszy, pierwszy-1, pierwszy-2 itd.
Ostatni znak można pobierać np substr($title, -1) i np jeśli jest >0 dodawać 1. Problem w tym, jak to wykonać aż do skutku ?

Dzięki za rady

1

Hmm, możesz robić selecta z where name like 'pierwszy-%', i wyciągnąć wartość MAX() z tego co po myślniku.

2

Albo wyciagnij jaki jest kolejny numer auto increment i dodaj go do aliasu

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;
3
chomikowski napisał(a):

Albo wyciagnij jaki jest kolejny numer auto increment i dodaj go do aliasu

SELECT AUTO_INCREMENT
FROM information_schema.tables
WHERE table_name = 'table_name'
AND table_schema = DATABASE( ) ;

Nie polegałbym na tym. A co jeśli w bazie będzie wpis z nazwą pierwszy-1234 (po prostu taka nazwa), a autoincrement wskaże na niższą wartość? W końcu spowoduje to kolizję.

Najlepiej po prostu spróbować wyfiltrować największy suffix i tyle.

W sumie najlepiej by było chyba zrobić taką tabelkę:
nazwa (z suffixem), oryginalna nazwa (nez suffixu), suffix. Albo nawet pozbyć się kolumny nazwa, a połączyć oryginalna_nazwa i suffix concatem.

Wtedy mamy prosty select max(suffix) from tabelka where oryginalna_nazwa = abcd

0

Generowanie unikalnej wartości w ramach tabeli to chyba jedna z najtrudniejszych rzeczy w RDBS. Rozwiązanie @serek jest spoko tylko że przy dużym ruchu też wpadniesz w kolizje ponieważ pomiędzy jednym zapytaniem, a drugim jest spora dziura czasowa i mówię to z autopsji.

Najlepiej przybliżyć się do bazy danych najbliżej jak się da i robić to przez funkcję. Jeżeli jedyną aplikacją jaka będzie korzystać z danej bazy jest twoja to ja bym się nie przejmował tym co napisał serek ale można to obsłużyć łapiąc wyjątek i powtarzając czynność. @chomikowski zaproponował dobre rozwiązanie ponieważ sekwencje są poza transakcjami. To znaczy że jeżeli podbije licznik w transakcji to inna transakcja bez potrzeby commitowania widzi ten podbity licznik wadą rozwiązania jest to że mogą pojawić się dziury w numeracjach.

A i nie rób mechanizmu "jak mi się nie udało to ponawiam do skutku" załóż sobie jakiś realny licznik np 5 prób.

0

Dodawaj zawsze krótki losowy hash na początku sluga np. "jProZ,pierwszy-super-tytul" - prawdopodobnieństwo, że coś się zdubluje jest bardzo małe

0

GUID

0
AnyKtokolwiek napisał(a):

GUID

Długi strasznie i brzydko tu wygląda. Może starczy coś krótszego, np. 8 znaków. Pytanie po co to w ogóle jest potrzebne. Może nie ma sensu w ogóle jakiegoś suffixu generować?

Może po prostu starczy podawać nazwę taka jaka jest, nawet jeśli już taka istnieje? A do odróżnienia rekordów i tak masz jakieś ID, które ZAWSZE będzie unikalne, więc można je dokleić potem do nazwy, jeśli będzie potrzeba.

0

https://www.postgresql.org/docs/9.1/datatype-uuid.html ale serek ma 100% racji wyciągamy armaty do problemu który pewnie jest zdeka inny

0

Dzięki za wszystkie odpowiedzi, znajdę coś dla siebie :) Alias musi być unikalny ponieważ na jego podstawie będą pobierane dane obiektu (ma zastąpić id) - osobiście zostałbym przy ID w linku - standardowo - jednak, podobno, link gdzie jest alias a nie ma id lepiej wpływa na SEO

0

To alias dodawany bezpośrednio do nazwy bez sensu w takim razie. Generuj sobie w osobnej kolumnie jakiś uuid, np. 8 znakowy (powinien być wystarczający) i tyle. A potem w linku w przeglądarce będziesz mieć coś w stylu jak na tym forum: {uuid}-{nazwa}

0

i później szukać tylko po tym uuid a nie po aliasie, cn?

0

Tak, tylko po uuid. To co po uuid podajesz w linku to cię nie obchodzi - zresztą sam sprawdź i usuń to co na forum masz po id, albo zmień na coś innego - nadal przekierowanie będzie działać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1