Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Pytanie] Sql UUID a kod mieszajacy


Rekomendowane odpowiedzi

Opublikowano

czy kod haszujacy z UUID gracza będzie stały :? ,

 no niby powinien być ale trochę się boję :?  potrzebuje tego do sglite jako ID wiersza , samemu nie wiem jak by tu zrobić metody haszujacej :/ a już zaczyna mi brakować pomysłów.

czy warto robić np. 10 kolumn z String (krótkie łańcuch do 10 znaków przy czym wszystkie te Stringi były by wczytywane) czy lepiej jeden String(np 100 znakowy)

 

i pytania poza konkursem

jest może jakiś "kalkulator" wektorów  ?? czy coś w ten deseń

 

hm pamiętam z gimnazjum taki fajny program do rysowania (z tego co pamiętam rysował same linie) , chodziło w nim o to że wpisywałeś wzór a komputer według tego wzoru rysował linie (coś ala fraktal z tym że były to linie i dość proste wzory) mam nadzieję że w miarę dobrze wytłumaczyłem o co mi chodzi :P

Opublikowano

kod haszujący UUID? o co dokładnie ci chodzi? I co chcesz dokładnie tam przechowywać, w tym SQLite.

 

I co do SQLite...

SQLite jest tak zrobienie, że nie baw się w żadne specjalne optymalizacje, ono i tak czyta wszystkie kolumny prawie tak samo, nie ważne czy dasz np VARCHAR czy TEXT czy uj wie co :P

1438614356923701010629.png

 

Opublikowano

potrzebuje zapisać informacje o graczu , no i do tego fajnie by było aby ID ( primary key) było jakoś skojarzone z konkretnym graczem . chciałem to zrobić właśnie za pomoca uuid i hashcode ,

 

mam nadzieję że dobrze pisze :)

Opublikowano

potrzebuje zapisać informacje o graczu , no i do tego fajnie by było aby ID ( primary key) było jakoś skojarzone z konkretnym graczem . chciałem to zrobić właśnie za pomoca uuid i hashcode ,

 

mam nadzieję że dobrze pisze :)

że niby uuid.hashcode ? jak, tak to pomysł ujowy.

UUID to coś jak 2x long, czyli 128 bitów. 

hashcode zwraca int, czyli marne 32 bity :P 

 

Oczywiście szansa niby jest mała że trafi się własnie takie UUID z tym samym hashcode, bo to raczej nie działa "tak prosto", ale jednak...

Czyli każda wartość zwrócona przez hashcode może odpowiadać średnio 79228162532711081671548469249 UUID :D

 

 

zrób normalny klucz ID, ze zwykłą liczbą i zwykłym liczeniem od 1 do ...

Ale ustaw UUID jako unique, lub też jako drugi klucz :P

1438614356923701010629.png

 

Opublikowano

no ale tutaj znowu nie będe mógł ustawić klucza na wartość (która mógłbym bezpośrednio skojarzyć z graczem) no i musiał bym zrobić drugą tabelę która przechowywała by String z uuid gracza oraz Id rekordu do drugiej tabeli

no i na koniec aby całość działała musiał bym zrobić w pluginie HashMap<uuid (z tabeli) , id (rekordu tabeli) >

to był mój pierwszy pomysł no ale trochę zagmatwany (chyba ze tobie chodziło o cos innego :), a ja chciał bym jakoś to tak zrobić aby zapisać gracza w formie liczby , i tą liczbę wykorzystać jako klucz do wierszy w tabeli

jeśli dało by radę pobrać wiersz tabeli po uuid jako unique to od razu wybieram tą opcję ale nie wiem czy jest taka możliwość :/

Opublikowano

no ale tutaj znowu nie będe mógł ustawić klucza na wartość (która mógłbym bezpośrednio skojarzyć z graczem) no i musiał bym zrobić drugą tabelę która przechowywała by String z uuid gracza oraz Id rekordu do drugiej tabeli

no i na koniec aby całość działała musiał bym zrobić w pluginie HashMap<uuid (z tabeli) , id (rekordu tabeli) >

to był mój pierwszy pomysł no ale trochę zagmatwany (chyba ze tobie chodziło o cos innego :), a ja chciał bym jakoś to tak zrobić aby zapisać gracza w formie liczby , i tą liczbę wykorzystać jako klucz do wierszy w tabeli

jeśli dało by radę pobrać wiersz tabeli po uuid jako unique to od razu wybieram tą opcję ale nie wiem czy jest taka możliwość :/

poucz się SQL, i pisz pod MySQL, SQLite to gie :P

 

HashMap<uuid (z tabeli) , id (rekordu tabeli) >

 

ale po co?

 

Mały przykład mojej tabelki, tutaj nie mam UUID, bo nie jest potrzebne.

Mam takie tabelki:

            stat.addBatch("CREATE TABLE IF NOT EXISTS nicknames (id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(16) UNIQUE)");
            stat.addBatch("CREATE TABLE IF NOT EXISTS exceptions (exception BOOLEAN, nickname_id INTEGER)");

i np chce poprać coś z exceptions:

    @Override
    public boolean isException(final String name)
    {
        try (final PreparedStatement stat = this.con.prepareStatement("SELECT exception FROM exceptions WHERE nickname_id = (SELECT nicknames.id FROM nicknames WHERE nicknames.name LIKE ?)"))
        {
            stat.setString(1, name);
            try (final ResultSet set = stat.executeQuery())
            {
                return set.next() && set.getBoolean("exception");
            }
        } catch (final SQLException e)
        {
            throw new RuntimeException(NAME + " error", e);
        }
    }

1 proste pobranie używając nicku, nie potrzebuje znać jego ID.

 

 

A oto dlaczego SQLite ssie: (chce dodać, lub zaktualizować wiersz)

   @Override
    public void setException(final String name, final boolean bool)
    {
        final String sqlName = nicknameOrNull(name);
        final String sBool = toInt(bool);
        try (final Statement stat = this.con.createStatement())
        {
            stat.addBatch("INSERT OR IGNORE INTO exceptions (nickname_id, exception) VALUES ((SELECT nicknames.id FROM nicknames WHERE nicknames.name LIKE " + sqlName + "), " + sBool + ")");
            final int[] results = stat.executeBatch();
            if (results[0] <= 0)
            {
                stat.clearBatch();
                stat.addBatch("UPDATE exceptions SET exception = " + sBool + " WHERE nickname_id = (SELECT nicknames.id FROM nicknames WHERE nicknames.name LIKE " + sqlName + ")");
                stat.executeBatch();
            }
        } catch (final SQLException e)
        {
            throw new RuntimeException(NAME + " error", e);
        }
    }

muszę używać dwóch zapytań, a do tego nie mogę użyć PreparedStatement, więc muszę sam zadbać by te dane były "bezpieczne" dla bazy.

 

A tak to wygląda w MySQL:

    @Override
    public void setException(final String name, final boolean bool)
    {
        try (final PreparedStatement stat = this.con.prepareStatement("INSERT INTO exceptions (nickname_id, exception) VALUES ((SELECT nicknames.id FROM nicknames WHERE nicknames.name LIKE ?), ?) ON DUPLICATE KEY UPDATE exception = ?"))
        {
            stat.setString(1, name);
            stat.setBoolean(2, bool);
            stat.setBoolean(3, bool);
            stat.executeBatch();
        } catch (final SQLException e)
        {
            throw new RuntimeException(NAME + " error", e);
        }
    }

jedno, proste zapytanie.

 

 

 

No i do tego w MySQL, można się bawić w optymalizacje, czyli dopasowywać wielkości pół do tego co chcemy tam trzymać, SQLite traktuje wszystko jednakowo, nie ważne czy dasz BOOLEAN czy BIGINT, dla niego to po prostu liczba.

1438614356923701010629.png

 

Opublikowano

a widzisz ja bylem święcie przekonany że z sqlite aby pobrać jakiś rekord muszę znać jego ID Key no i po to były mi 2 tabele + hashMap<uuid ,integer>

głupi ja :)

dobrze że chociaż jedna osoba w tym dziale umie cos z programowania i pomaga tak idiotom jak ja ...

 

czy sqlite i mysql różnią się (w jakiś znaczący sposóB) jeśli chodzi o "tworzenie" zapytań do baz danych ??

no to nie pozostaje mi nic tylko zagłębić się w tajniki silnika sql :)

Opublikowano

a widzisz ja bylem święcie przekonany że z sqlite aby pobrać jakiś rekord muszę znać jego ID Key no i po to były mi 2 tabele + hashMap<uuid ,integer>

głupi ja :)

dobrze że chociaż jedna osoba w tym dziale umie cos z programowania i pomaga tak idiotom jak ja ...

 

czy sqlite i mysql różnią się (w jakiś znaczący sposó B) jeśli chodzi o "tworzenie" zapytań do baz danych ??

no to nie pozostaje mi nic tylko zagłębić się w tajniki silnika sql :)

SQLite nie ma wielu opcji, i rozróżnia tylko 4 typy danych. Liczby całkowite, liczby rzeczywiste, text, i dane (BLOB), bo tak to nie ważne czy ustawisz kolumnę na INTEGER czy na TINYINT  czy nawet na BOOLEAN, i tak potraktuje to po prostu jako liczbę całkowitą.

 

MySQL rozróżnia już te typy, co umożliwia zacznie lepszą optymalizację.

 

PS: silników baz danych jest masa. MySQL i masa innych to tylko systemy zarządzania nimi.

Silnik, to np domyślny w MySQL i przez to jeden z popularniejszych: InnoDB -> http://en.wikipedia.org/wiki/InnoDB

1438614356923701010629.png

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...