Zalogowany jako: gość

Forum

Wątek: Plan rozwoju Eltena

Wróć do listy wątków

1 z 3

Następna

1 z 42: pajper

Witajcie!
Myślałem nad prośbami wielu użytkowników w związku ze stworzeniem jakiegoś planu prac nad Eltenem. Zacząłem go pisać i zorientowałem się, że nie ma to sensu.
Przepraszam, ale obecny sposób rozwijania projektu kreślił sam siebie w kilku punktach.
Dlatego nieco założenia zmieniłem, opóźniłem pewne rzeczy, ale kosztem spójności.


Największym problemem Eltena jest jego, nazwijmy to, różność działania. Kod jest tak rozproszony, że w jednym miejscu działa inaczej, w innym inaczej. Trzeba tu zrobić porządek.
Do wszystkiego dochodzi nam jeszcze aplikacja mobilna, która jest niekompatybilna z serwerem wersji stabilnej, plus strona Internetowa, która jest niemal reliktem przeszłości.
Tak, trudno jest ogarniać to wszystko w jedną osobę, ale właśnie dlatego trzeba trochę zmienić założenia. Taki chaos może panować (i panuje) w dużych projektach, gdzie wszystko się rozbija na niemal niezależne podprogramy, nad którymi inne sztaby pracują. Jednak tu jest to niemożliwe.
Dlatego trzeba to wszystko ujednolicić.

W pierwszym kroku chciałbym przepisać (całość) serwera na język Ruby i technologię JSON.
Dlaczego? Ponieważ wprowadzane grupy wymagają pisania nowych modułów, które kreślą poprzednie. Pojawiają się całe partie kodu kopiowane między plikami i powstaje niepotrzebny chaos. Dodatkowo obecny sposób pisania serwera bardzo utrudnia rozwijanie pewnych funkcjonalności.
Jak często muszę powtarzać, że dana funkcja jest niemożliwa do zrealizowania z powodu serwera...
Serializacja JSON bardzo upraszcza proces implementacji nowości. Trochę na tym stracimy, ale wierzę, że owoce przyniesie to dobre.
Dodatkowo, z tego samego API będzie mogła korzystać strona, wersja mobilna i Desktopowa, co trzykrotnie zmniejszy czas prac na serwerze.
Koncept dla programistów pojawi się na Githubie pewnie w okolicach 10 maja.

Elten 2.3 już w gałęzi beta posiada wsparcie dla JSONa, a więc implementacja zmian w kliencie nie powinna potrwać zbyt długo, pewnie koło dwóch tygodni. Nie będzie to jeszcze mój wymarzony sposób modelowania danych, ale już pierwszy krok na drodze do niego. Przewiduję więc, że proces ten powinien potrwać do końca maja, może do pierwszych dni czerwca, przy czym nie obiecuję.
Wtedy mogą pojawić się wreszcie te grupy na nowym, mniej chaotycznym API. I to nie będzie problem, bo w API JSONa ich napisanie będzie dużo prostsze, jestem więc pewien, że Elten 2.3 z grupami i nowym systemem połączeń pojawi się w wersji beta jeszcze w czerwcu.
Przy okazji będzie można ujednolicić całe przetwarzanie wyjątków, dodać pewne funkcje moderatorskie i naprawić jeden z nienaprawialnych w obecnym systemie serwera błędów polegających na "Elten - Brak Odpowiedzi".
Myślę, że Eltena 2.3 można wydać ostatecznie w rocznicę premiery, 24 sierpnia. Podsumowując, będzie zawierał nowy system obsługi klawiatury, nowy system tłumaczeń i siedem nowych języków, obsługę połączeń przez JSON i nowe systemy połączeń, nowy sposób przetwarzania powiadomień, grupy i pewnie walle użytkowników, jeśli do tego czasu na forum dogadamy się, jak to ma wyglądać.

W następnej kolejności chciałbym się skupić na aplikacji mobilnej, czyli ją podciągnąć do obsługi nowego API. W sumie myślę, że prace będą postępowały mniej-więcej równolegle z klientem, gdyż spore partie kodu będą współdzielone. Myślę, że również w okolicach sierpnia będzie ona zdatna do użytku pełnego, a pod koniec roku można zacząć starać się o umieszczenie jej w Appstorze. Potem przyjdzie czas na wersję na Androida.

Jeśli chodzi o stronę Internetową, obawiam się, że tu jesteśmy uzależnieni od możliwości pomocy widzących webmasterów, więc trudno mi szacować terminy.

W każdym razie, gdy Elten pojawi się na komputerach w wersji 2.3 i na telefonach w ogóle, chciałbym na poważnie zabrać się za nowy silnik. Idealnie byłoby, gdyby za rok we wakacje pojawiła się finalna wersja 3.0 działająca na Windowsie, Linuxie i Macu.

Jak widać, niewiele nowości w ciągu tego roku przewiduję, ale myślę, że ważniejsze od nowości są poprawki stabilności i wydajności.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
25.04.2019 12:48

2 z 42: jamajka

A czy grupy pojawią się dopiero wtedy, w czerwcu, czy będą jeszcze w tym systemie w ogóle pokazane?
rzeczy niemożliwe od ręki, cuda w przeciągu trzech dni.
25.04.2019 13:17

3 z 42: pajper

Nie, w czerwcu. Pisanie ich dwa razy jest krztynkę bez sensu.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
25.04.2019 13:18

4 z 42: markus1234

No cóż, poczekamy. Ale szkoda, że dopiero w czerwcu będą grupy.

25.04.2019 16:33

5 z 42: lukaszenka

I to jest konkret, a mi pozostaje jedynie życzyć żeby wspomniane założenia udało się spełnić w zadanym czasie.

25.04.2019 16:39

6 z 42: tomecki

Szkoda, że koncepcje się tak szybko zmieniają. Pewnie ta jest suszna, chociaż się nie znam, ale skąd mam wiedzieć, że za np. dwa tygodnie coś nowego się nie pojawi? Tak w ogóle to zgadzam się żeby zacząć od podstaw i w ogóle możliwe, że tu trzeba masę rzeczy pozmieniać i im wcześniej tym lepiej, ale żeby to jakoś raz, na zawsze ustalić. Od zawieszenia projektu robi się nieze zamieszanie. Fora pojawiają się tylko częściowo, bo reszta w grupach. Potem jednak reszta w zasadzie też wraca, grupy mają być najpierw zaraz po odwieszeniu projektu, potem na majówkę, teraz tak bardziej na czerwiec...
To wszystko raczej nie buduje zaufania użytkowników, chociaż rozumiem w czym rzecz. Jeszcze raz chciabym baaardzo poprosić o stworzenie jakiejś spójnej koncepcji na to, jak to wszystko ma wyglądać, co najpierw, co potem, gdzie jaki priorytet, bo tu na prawdę niektórych atwo zniechęcić, a jeszcze atwiej plotkę wygenerować, jakoby np. autor sam nie wie czego chce. Nie ukrywam, że trochę mnie to wszystko zaczyna przerażać, bo jednak ten kiernek zmian co chwila się hm... zmienia.

25.04.2019 16:40

7 z 42: pajper

@Tomecki pełna zgoda.
Dlatego starałem się zrobić koncepcję, która co pięć kroków nie kreśli poprzednich, a na razie tak trochę to wyglądało, koncepcję rozwoju w sensie.
Obecnie bardzo trudno Eltena zmieniać, bo nie jest do tych zmian dostosowany. Dlatego trzeba sprawić, by ten kod był bardziej elastyczny i czytelny.
Dopiero potem można na poważniej się zastanawiać.
Bo inaczej wpadniemy w kozi róg, wprowadzone zostaną grupy, ale nagle padnie propozycja jakiejś zmiany w grupach. I okaże się, że jest nie do zrealizowania, bo trzeba wszystko od nowa napisać.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
25.04.2019 16:42

8 z 42: EugeniuszPompiusz

Fajny krok z JSONem; Popieram od dawna dawien.
A tam, gdzie JSON nie może XML pośle.
Mniej roboty, a w sumie zbytnich skutków ubocznych wdrożenia JSON i serializacji nie widzę.

Co ewentualnie mielibyśmy stracić? No może poza tym, że request będzie parę bajtów większy, a i to nie bardzo i nie zawsze.
Dla mnie praktycznie same plusy
Sygnaturka.: "That seems to point up a significant difference between Europeans and Americans. A European says: 'I can't understand this, what's wrong with me?' An American says: 'I can't understand this, what's wrong with him?'" TERRY PRATCHETT
25.04.2019 17:11

9 z 42: mojsior

ja mam nadzieję, że doczekam się tych zmian i będą one widoczne, bo jak na razie forum przypomina mi nazwijmy to ładnie stajnię augiasza, gdzie dość trudno mi zapanować nad treściami tam zawartymi, co skutkuje tym, że z forów praktycznie nie korzystam.
Ja rozumiem wszystko studia, i inne sprawy i wiem, że pewne zmiany muszą poczekać tym bardziej że robisz to sam.
Gdybym miał polecić eltena jakiemuś nowemu użytkownikowi, to raczej ciężko by mi było ze względu na stan w jakim to wszystko na chwilę obecną się znajduje.
Mam nadzieję, że zmiany nadejdą jaknajszybciej

25.04.2019 17:58

10 z 42: misiek

Z tą stajnią Augiasza to bym nie przesadzał. Może w tej chwili nie wygląda to wszystko pięknie, ale jest jak najbardziej do ogarnięcia.
Po co na świecie są białe koty? Po to, by czarni też mogli mieć pecha.
25.04.2019 18:16

11 z 42: mikolajholysz

Stajnia augiasza to jest wg mnie z winy użytkowników, ewentualnie moderacji, raczej użytkowników.
w związku z przesiadką na Maca, prawie mnie tutaj nie ma. Inne sposoby kontaktu w wizytówce.
25.04.2019 19:31

12 z 42: pajper

"A maze of twisty little forums, all alike" - tak Mikołaj nazwał koncept układu kodu, który wdrażam. Donoszę, że modele serwera są już na ukończeniu.

Tak jak zapowiadałem, fora, wiadomości, blogi, ankiety są subklasami. Mały szkic koncepcyjny:

Klasa MD_MATLBase, przykładowe funkcje:
get_structure - zwraca strukturę forów, podforów (względnie kategorii, konwersacji itp.) w formie klasy Struct_MatlTree, którą można indeksować jak zwykłą tablicę wielowymiarową.
get_thread(threadid) - zwraca dany wątek
get_search(phrase) - wykonuje wyszukiwanie i zwraca inną klasę tego samego typu zawierającą jedynie wyniki wyszukiwania.
can_structurechange - zwraca czy można edytować strukturę
can_threadadd - zwraca czy można tworzyć nowe wątki
can_threaddelete - zwraca czy można usuwać wątki
I tak dalej, pełna dokumentacja pojawi się wraz z kodem.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
10.05.2019 14:51

13 z 42: pajper

rewrite schematu bazy dla nowego API:

ActiveRecord::Schema.define(version: 0) do

create_table "actived", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "date", null: false
t.binary "shown", limit: 1, default: "b'0'"
t.binary "actived", limit: 1, default: "b'0'"
end

create_table "apns", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "appid", limit: 128
t.string "devicetoken", limit: 1024
t.string "name", limit: 64
t.index ["name"], name: "name"
end

create_table "apps", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "version", limit: 16, null: false, collation: "utf8_general_ci"
t.string "description", limit: 16384, null: false, collation: "utf8_general_ci"
t.string "file", limit: 64, null: false, collation: "utf8_general_ci"
end

create_table "attachments", id: :string, limit: 128, collation: "utf8mb4_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 128, collation: "utf8mb4_general_ci"
t.integer "uploadtime"
end

create_table "authcodes", primary_key: "name", id: :string, limit: 64, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "code", limit: 8
t.integer "tries", limit: 1
end

create_table "authenticated", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "name", limit: 64
t.string "appid", limit: 96
t.integer "date"
end

create_table "authentications", primary_key: "name", id: :string, limit: 64, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "phone", limit: 16
t.binary "actived", limit: 1
t.string "code", limit: 8
t.integer "tries", limit: 1
end

create_table "autologins", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "token", limit: 256, collation: "utf8mb4_general_ci"
t.string "name", limit: 64, collation: "utf8mb4_general_ci"
t.integer "date"
t.string "ip", limit: 16, collation: "utf8mb4_general_ci"
t.string "computer", limit: 128, collation: "utf8mb4_general_ci"
end

create_table "banned", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "totime", null: false
t.string "reason", limit: 1024, collation: "utf8_general_ci"
end

create_table "blacklist", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "owner", limit: 64
t.string "user", limit: 64
t.integer "type", limit: 1, unsigned: true
end

create_table "blog_assigning", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, collation: "utf8_general_ci"
t.integer "postid", null: false
t.integer "categoryid", null: false
t.index ["owner", "categoryid"], name: "owner"
end

create_table "blog_categories", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.string "name", limit: 512, collation: "utf8_general_ci"
t.integer "privacy", limit: 1, unsigned: true
t.index ["owner"], name: "owner"
end

create_table "blog_comments_waiting", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "postid"
t.string "nick", limit: 64, collation: "utf8mb4_general_ci"
t.string "comment", limit: 4096, collation: "utf8mb4_general_ci"
t.string "mail", limit: 64, collation: "utf8mb4_general_ci"
t.string "token", limit: 64, collation: "utf8mb4_general_ci"
end

create_table "blog_posts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.string "name", limit: 512, collation: "utf8_general_ci"
t.integer "postid"
t.integer "posttype", limit: 1, unsigned: true
t.text "post", limit: 4294967295, collation: "utf8_general_ci"
t.integer "privacy", limit: 1, unsigned: true
t.integer "date"
t.integer "moddate"
t.index ["owner", "postid"], name: "owner"
end

create_table "blog_read", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, collation: "utf8_general_ci"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.integer "post"
t.integer "posts"
t.binary "noticed", limit: 1
t.binary "followed", limit: 1, default: "b'0'", null: false
t.index ["author", "post"], name: "author"
t.index ["owner", "author", "post"], name: "owner", unique: true
end

create_table "blogs", primary_key: "owner", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 1024, null: false, collation: "utf8_general_ci"
t.integer "lastupdate"
end

create_table "buffers", id: :integer, default: nil, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.text "data", limit: 4294967295, collation: "utf8_general_ci"
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.integer "date", null: false
end

create_table "cache", id: :integer, default: nil, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "content", limit: 16384
t.integer "updatedate"
t.integer "expiredate"
t.string "forumname", limit: 64
end

create_table "chat", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "sender", limit: 64, collation: "utf8mb4_general_ci"
t.integer "time"
t.string "message", limit: 4096, collation: "utf8mb4_general_ci"
end

create_table "chat_actived", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "date", null: false
end

create_table "chess", id: :integer, default: nil, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "player", limit: 64
t.string "player1", limit: 64
t.string "player2", limit: 64
t.integer "color"
t.string "winner", limit: 64
t.string "chessboard", limit: 256
end

create_table "contacts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, collation: "utf8_general_ci"
t.string "user", limit: 64, collation: "utf8_general_ci"
t.integer "noticed"
t.integer "birthdaynotice"
t.index ["owner", "birthdaynotice"], name: "owner_2"
t.index ["owner"], name: "owner"
end

create_table "events", id: :integer, default: nil, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.integer "fromtime"
t.integer "totime"
end

create_table "failedlogins", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "login", limit: 64, collation: "utf8mb4_general_ci"
t.string "password", limit: 128, collation: "utf8mb4_general_ci"
t.string "crp", limit: 128, collation: "utf8mb4_general_ci"
t.string "token", limit: 128, collation: "utf8mb4_general_ci"
t.string "ip", limit: 16, collation: "utf8mb4_general_ci"
t.integer "date"
end

create_table "followedblogs", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, collation: "utf8_general_ci"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.index ["owner"], name: "owner"
end

create_table "followedforums", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, collation: "utf8mb4_general_ci"
t.string "forum", limit: 64, collation: "utf8mb4_general_ci"
t.integer "agreement"
t.index ["owner", "forum"], name: "owner", unique: true
end

create_table "followedthreads", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.string "forum", limit: 128, collation: "utf8_general_ci"
t.integer "thread"
t.index ["owner", "thread"], name: "owner", unique: true
t.index ["owner"], name: "owner_2"
t.index ["thread"], name: "thread"
end

create_table "forum_groups", id: :integer, default: nil, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 256, collation: "utf8_general_ci"
t.string "lang", limit: 8, collation: "utf8_general_ci"
t.string "description", limit: 8192
t.string "founder", limit: 64
t.binary "open", limit: 1, default: "b'0'"
t.binary "public", limit: 1, default: "b'1'"
t.binary "recommended", limit: 1, default: "b'0'"
end

create_table "forum_groups_members", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "user", limit: 64, null: false
t.integer "groupid", null: false
t.integer "role", limit: 1, default: 0, null: false
t.integer "joined"
t.index ["user", "groupid"], name: "user", unique: true
end

create_table "forum_groups_pinned", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "owner", limit: 64, null: false
t.integer "groupid", null: false
t.integer "position", default: 0
t.index ["owner", "groupid"], name: "owner", unique: true
end

create_table "forum_posts", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "thread"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.string "date", limit: 32, collation: "utf8_general_ci"
t.text "post", limit: 4294967295, collation: "utf8_general_ci"
t.index ["thread"], name: "thread"
end

create_table "forum_posts_deleted", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "thread"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.string "date", limit: 32, collation: "utf8_general_ci"
t.text "post", limit: 4294967295, collation: "utf8_general_ci"
end

create_table "forum_read", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.string "forum", limit: 128, collation: "utf8_general_ci"
t.integer "thread"
t.integer "posts"
t.binary "noticed", limit: 1
t.index ["owner", "thread"], name: "owner", unique: true
end

create_table "forum_threads", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 512, collation: "utf8_general_ci"
t.string "forum", limit: 64, collation: "utf8_general_ci"
t.integer "lastpostdate"
t.index ["forum"], name: "forum"
end

create_table "forums", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 128, collation: "utf8_general_ci"
t.integer "groupid"
t.string "fullname", limit: 512, collation: "utf8_general_ci"
t.integer "type"
t.index ["groupid"], name: "groupid"
end

create_table "greetings", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "text", limit: 1024, collation: "utf8_general_ci"
end

create_table "honors", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "name", limit: 128
t.string "description", limit: 4096
t.string "enname", limit: 128
t.string "endescription", limit: 4096
end

create_table "languages", primary_key: "code", id: :string, limit: 8, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "language", limit: 128, null: false, collation: "utf8_general_ci"
t.string "file", limit: 32, null: false, collation: "utf8_general_ci"
end

create_table "logins", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "name", limit: 64, null: false
t.string "ip", limit: 16, null: false
t.integer "time"
t.string "version", limit: 8
t.string "versiontype", limit: 16
t.string "beta", limit: 8
t.string "appid", limit: 96
end

create_table "mails_confirmed", id: false, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "mail", limit: 64, collation: "utf8mb4_general_ci"
t.string "ip", limit: 64, collation: "utf8mb4_general_ci"
end

create_table "media", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.integer "object", null: false
end

create_table "media_categories", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "name", limit: 128
t.string "description", limit: 1024
end

create_table "media_data", primary_key: "fid", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.integer "id", null: false
t.string "url", limit: 256
t.string "name", limit: 256
t.string "description", limit: 1024
t.string "addedby", limit: 64
t.integer "category"
end

create_table "mentions", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "author", limit: 64, collation: "utf8mb4_general_ci"
t.string "user", limit: 64, collation: "utf8mb4_general_ci"
t.integer "type", limit: 1, unsigned: true
t.integer "thread"
t.integer "post"
t.string "message", limit: 1024, collation: "utf8mb4_general_ci"
t.integer "noticed"
t.index ["user"], name: "user"
end

create_table "messages", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "sender", limit: 64, collation: "utf8_general_ci"
t.string "receiver", limit: 64, collation: "utf8_general_ci"
t.string "date", limit: 32, collation: "utf8_general_ci"
t.string "subject", limit: 512, collation: "utf8_general_ci"
t.text "message", limit: 4294967295, collation: "utf8_general_ci"
t.integer "read"
t.binary "deletedfromreceived", limit: 1
t.binary "deletedfromsent", limit: 1
t.binary "marked", limit: 1
t.string "attachments", limit: 512, collation: "utf8_general_ci"
t.integer "noticed"
t.text "origmail", limit: 4294967295
t.index ["receiver"], name: "receiver"
t.index ["sender"], name: "sender"
end

create_table "notes", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 128, collation: "utf8mb4_general_ci"
t.text "note", limit: 16777215, collation: "utf8mb4_general_ci"
t.integer "created"
t.integer "modified"
t.string "author", limit: 64, collation: "utf8mb4_general_ci"
end

create_table "notes_shared", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "user", limit: 64, collation: "utf8mb4_general_ci"
t.integer "permissions"
t.integer "note"
end

create_table "notifications", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
t.string "receiver", limit: 64, null: false
t.integer "date"
t.string "notification", limit: 256, null: false
t.string "sound", limit: 64
t.integer "cat", default: 0, null: false
t.string "appids", limit: 8192, default: "", null: false
t.index ["receiver"], name: "receiver"
end

create_table "polls", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 256, collation: "utf8_general_ci"
t.string "author", limit: 64, collation: "utf8_general_ci"
t.integer "created"
t.string "description", limit: 8192, collation: "utf8_general_ci"
t.text "questions", limit: 4294967295, collation: "utf8_general_ci"
end

create_table "polls_answers", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "author", limit: 64, collation: "utf8_general_ci"
t.integer "poll", null: false
t.integer "question", null: false
t.string "answer", limit: 1024, collation: "utf8_general_ci"
end

create_table "privileges", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.binary "tester", limit: 1, default: "b'0'"
t.binary "moderator", limit: 1, default: "b'0'"
t.binary "media_administrator", limit: 1, default: "b'0'"
t.binary "developer", limit: 1, default: "b'0'"
t.binary "translator", limit: 1, default: "b'0'"
t.binary "administrator", limit: 1, default: "b'0'"
t.string "data", limit: 64, null: false, collation: "utf8_general_ci"
end

create_table "profiles", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "fullname", limit: 64, collation: "utf8_general_ci"
t.binary "gender", limit: 1
t.integer "birthdateyear"
t.integer "birthdatemonth"
t.integer "birthdateday"
t.string "location", limit: 256, collation: "utf8_general_ci"
t.binary "publicprofile", limit: 1
t.binary "publicmail", limit: 1
end

create_table "publictesters", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "version", limit: 16, collation: "utf8_general_ci"
t.string "beta", limit: 8, collation: "utf8_general_ci"
end

create_table "registrations_waiting", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 64, collation: "utf8mb4_general_ci"
t.string "password", limit: 128, collation: "utf8mb4_general_ci"
t.string "mail", limit: 128, collation: "utf8mb4_general_ci"
t.string "token", limit: 128, collation: "utf8mb4_general_ci"
t.integer "requesttime"
end

create_table "signatures", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "signature", limit: 8192, collation: "utf8_general_ci"
end

create_table "statuses", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "status", limit: 4096, collation: "utf8_general_ci"
end

create_table "tokens", primary_key: "token", id: :string, limit: 96, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "name", limit: 64, collation: "utf8_general_ci"
t.string "time", limit: 8, collation: "utf8_general_ci"
t.string "version", limit: 8
end

create_table "uploads", primary_key: "file", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "owner", limit: 64, null: false, collation: "utf8_general_ci"
t.string "filename", limit: 128, null: false, collation: "utf8_general_ci"
end

create_table "users", primary_key: "name", id: :string, limit: 64, collation: "utf8_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "password", limit: 256, collation: "utf8_general_ci"
t.string "mail", limit: 128, collation: "utf8_general_ci"
t.string "resetpassword", limit: 128, collation: "utf8_general_ci"
end

create_table "users_honors", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.string "user", limit: 64, collation: "utf8mb4_general_ci"
t.integer "honor"
t.integer "main"
end

create_table "visitingcards", primary_key: "name", id: :string, limit: 64, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.text "text", limit: 16777215, null: false
end

create_table "whatsnew", primary_key: "name", id: :string, limit: 64, collation: "utf8_polish_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "messages", null: false
t.integer "posts", null: false
t.integer "blogposts"
t.integer "blogcomments"
end

create_table "whatsnew_config", primary_key: "owner", id: :string, limit: 64, collation: "utf8mb4_general_ci", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci", force: :cascade do |t|
t.integer "messages"
t.integer "followedthreads"
t.integer "followedblogs"
t.integer "blogcomments"
t.integer "followedforums"
t.integer "followedforumsthreads"
t.integer "friends"
t.integer "birthday"
t.integer "mentions"
end

end

#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
11.05.2019 13:29

14 z 42: tomecki

yyy, a myślałem, że to wina mojego NVDA, że się taaak zwiesiła. Chyba warto coś zrobić z takimi postami, bo jestem w stanie sobie wyobrazić, że komuś może takie coś niezłe kuku zrobić. Może przed długimi postami jakieś ostrzeżenie albo podzielić na kilka i i dodać jakiś mechanizm w rodzaju "naciśnij enter aby odczytać dalszą część"

11.05.2019 13:45

15 z 42: grzezlo

Dawidzie, skoro robisz rewrite bazy, to może warto by się rozprawić z paroma anachronizmami przy okazji, najbardziej wśród nich istotnym wydaje się używanie w różnych tabelach 64-bajtowej nazwy użytkownika, które lepiej byłoby zastąpić sztucznym kluczem numerycznym id użytkownika z tabeli użytkowników. Łączenie takich tabel w zapytaniach będzie efektywniejsze, kiedyś już o tym pisałem chyba na prv.
Dobrze byłoby też wprost zdefiniować klucze obce przez add constraint, to wówczas baza sama pilnuje spójności.
Są niespójności w definicjach, np. w tabeli attachments raz jest używane utf8, a raz utf8mb4. Te utf8 lepiej byłoby i bezpieczniej wszędzie zastąpić przez utf8mb4.
Od konkretnego upgrade schematu bazy nie uciekniesz, możesz to sobie zostawić na później, ale wówczas będziesz musiał zmodyfikować potencjalnie wszystkie istniejące zapytania w kodzie, co zazwyczaj jest bolesne i błędogenne.


11.05.2019 18:59

16 z 42: pajper

W nowym API będzie dużo łatwiej modyfikować strukturę bazy, bo oparte jest całe o MVC i ActiveRecord, przez co właściwych zapytań nawet prawie nie ma.
Co do dwójki, zgoda. Co do jedynki, tu już pewien nie jestem.

Z jednej strony int jest szybszy przy porównaniach tabel. Z drugiej często musiałyby być inty wymieniane na nazwy, przykłady: wysyłanie wiadomości prywatnej, renderowanie wpisów na forum, blogach.
Nie jestem pewien czy stosunkowo nie będzie właśnie mniej korzystnie w każdym zapytaniu tłumaczyć klucza na nazwę i odwrotnie.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
11.05.2019 19:03

17 z 42: grzezlo

Inty wymieniane na nazwy się robi przez łączenie tabel w zapytaniu, no i efektywne łączenie tabel to jest jedna z podstawowych funkcji serwera bazy danych.


11.05.2019 19:05

18 z 42: pajper

Jak się robi wiem, jak z optymalizacją tej metody nie wiem. :)

W serwisach, gdzie nazwa użytkownika jest mniej potrzebna, bo jest w istocie głównie loginem, sprawa jest mniej ważna i tu zysk z przejścia z charów na int jest spory.
Pytanie czy tak samo sprawa się ma w portalu, gdzie praktycznie każde zapytanie wymaga operacji na tych charach szczególnie, że mysql i tak sobie je cachuje. Nie wiem po prostu.
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
11.05.2019 19:08

19 z 42: grzezlo

Cyt: W serwisach, gdzie nazwa użytkownika jest mniej potrzebna, bo jest w istocie głównie loginem, sprawa jest mniej ważna
GZ: ale tam wtedy prócz loginu jest nazwa wyświetlana, czyli na to samo wychodzi.
Praktycznie każdy serwis się opiera na tym, że jest jakiś użytkownik i jakieś powiązane z nim zasoby w różnych tabelkach.
No i skoro powstało i jest powszechnie stosowane takie coś jak sztuczne klucze główne, to znaczy, że się to po prostu opłaca.

11.05.2019 19:11

20 z 42: pajper

Głowy nie dam i nie chcę fakenewsu podawać, ale o ile pamiętam, np. Wordpress także wyszukuje po nazwie.
W każdym razie problem jest dodatkowo komplikowany przez Frameworka. Tutaj mały przykład.
To kod z nowego API, który teoretycznie powinien działać fatalnie i być zoptymalizowany tragicznie.
Wygląda to tak, jakby przelecenie całego Eltenowego forum wymagało tysięcy selectów. W praktyce jednak ActiveRecord tak sobie MySQLa grupuje na poziomie tego, co pod maską, że zapytanie wykonuje się szybciej od joina z kodu w PHP, 0,03 sekundy dla PHP vs 0,01 sekundy dla Rubiego.

# A maze of Twisty Little Forums, All Alike

class MTLFHead < ActiveRecord::Base
self.abstract_class = true
attr_reader_with_default :editable,false
def count_groups
return groups.size
end
def count_forums
return groups.map { |g| g.count_forums }.sum
end
def count_threads
return groups.map { |g| g.count_threads}.sum
end
def count_posts
return groups.map { |g| g.count_posts}.sum
end
end

class MTLFGroup < ActiveRecord::Base
self.abstract_class = true
attr_reader_with_default :editable,false
def count_forums
return forums.size
end
def count_threads
return forums.map { |f| f.count_threads }.sum
end
def count_posts
return forums.map { |f| f.count_posts }.sum
end
end

class MTLFForum < ActiveRecord::Base
self.abstract_class = true
attr_reader_with_default :editable,false
def count_threads
return threads.size
end
def count_posts
return threads.map { |t| t.count_posts }.sum
end
end

class MTLFThread < ActiveRecord::Base
self.abstract_class = true
attr_reader_with_default :editable,false
attr_reader_with_default :anonymous,false
def author
return posts.first.author
end
def count_posts
return posts.size
end
end

class MTLFPost < ActiveRecord::Base
self.abstract_class = true
end
#StandWithUkraine Shoot for the Moon. Even if you miss, you'll land among the stars.
11.05.2019 19:13

Wróć do listy wątków

1 z 3

Następna

Nawigacja


Copyright (©) 2014-2024, Dawid Pieper