2011-08-02 19 views
25

Tworzę strukturę, która współpracuje z danymi podstawowymi. Jednym z wymagań dotyczących korzystania z mojej struktury w klasie Core Data jest to, że każdy podmiot, który chce posiadać zdolności Framework, będzie musiał być podjednostkami i podklasami podmiotu, który udostępniam Tobie. W tym celu nazwę tego obiektu Foo.Wydajność baz danych z jednostką nadrzędną

Dziś zdałem sobie sprawę, że przechowuje danych Core Wszystkie obiekty, które są podrzędne podmioty Foo do tabeli o nazwie ZFOO. Martwię się o wydajność Core Data, jeśli ktoś z ogromnymi zestawami danych chce z niej korzystać, ponieważ WSZYSTKIE jednostki podrzędne klasy foo będą przechowywane w jednej ogromnej tabeli ZFOO.

Wszelkie opinie lub zalecenia będą bardzo cenne.

+2

Tak, podklasy jest na ogół złe CoreData jeśli masz duże zbiory danych, ponieważ może skończyć się bardzo analizować tabele. jednak moja rada jest taka, aby przetestować pierwszy ... Napisz prostą aplikację, która tworzy tysiące obiektów z wielu różnych podklas klasy Foo i zobacz, jak zachowuje się system.Jeśli to nie jest zauważalne, to może i tak wszystko w porządku.Zawsze przetestuj zanim podejmiesz założenia dotyczące prędkości. –

+0

za radę bardziej szukałem opowieści grozy o tym bardzo źle. Im więcej czytam, tym bardziej Apple wydaje się zachęcać do tego rodzaju dziedziczenia w Core Data. – cruffenach

+1

Mogę potwierdzić, że nadal to robi w Xcode 5 DP5. – sudo

Odpowiedz

28

Ostatni rok pracowałem nad projektem, który zrobił to samo, możemy przechowywać wszystko, co w danych podstawowych i wszystko w danych podstawowych odziedziczonych z jednej klasy, który miał pewne wspólne cechy.

Mieliśmy gdzieś między 1k - 10k rekordów w danych podstawowych i wydajność zdegradowanych do punktu, w którym przepisał go i usunięto wspólnego przodka. Jak przypominam, proste wyszukiwania trwały kilka sekund, a wstawienia/aktualizacje również były dość brzydkie. Dopiero po tym, jak sprawy zaczęły boleć wolno, otworzyliśmy bazę i zauważyliśmy, że pod pokrywami główne dane przechowują wszystko w jednym stole.

Przepraszam, nie pamiętam konkretnych liczb, duży wybór wynosił, że musieliśmy go przerobić, ponieważ był zbyt wolny i nie za wolny jak za wolny do transakcji o wysokiej częstotliwości, ale zbyt wolny, jak aplikacja rozbijająca się podczas ładowania do wypełniania początkowego widoku z podstawowych danych.

Tak, z przymrużeniem oka, że ​​to było na starszych iOS i starszym sprzęcie, powiedziałbym, na pewno tego nie zrobi.

+2

Firma Apple zaleca, aby w jednym z ich zaawansowanych filmów z danymi podstawowymi nie umieszczać elementów podklasy w danych podstawowych. – Moshe

+0

+1 Dzięki Deathbob i @ Christopher Bradford - oboje zaoszczędziliście mi wielu kłopotów po tym, jak odkryłem, że dzieje się to na wczesnym etapie tworzenia aplikacji! – Rog

+0

Bardzo irytujący problem. Zrobiłem podklasę zarządzanego obiektu i spodziewałem się, że będę mógł umieścić je w osobnych tabelach. Całkowicie rujnuje widoki tabeli, gdy zostaną zebrane razem! Naprawdę nie ma sposobu na ich rozdzielenie? – sudo

36

Pracowałem z @deathbob nad tym projektem jako ołów iOS. W naszym przykładzie miałem wiele klas, które zawierały atrybuty "remote_id" i "remote_update". Początkowo ustawiłem tabele za pomocą podklas. Miałem abstrakcyjną istotę "RemoteEntity", która zawierała te atrybuty i grupę innych bytów, które odziedziczyły po niej, każda z własnymi. I myślałem, że będziemy mieli do czynienia z wieloma tabelami z remote_id, remote_update, a następnie ich niestandardowymi atrybutami. Zamiast tego znaleźliśmy ogromny stół, który opisujesz.

Poprawka była prosta: nie musisz konfigurować dziedziczenia za pośrednictwem interfejsu GUI. Zamiast tego umieść wszystkie atrybuty tego obiektu, w tym te współdzielone w modelu Core Data Data (co oznacza, że ​​w każdym obiekcie pojawią się "remote_id" i "remote_update", co oznacza, że ​​możemy nadal używać podklasy.) Po wygenerowaniu klas modeli, utwórz klasa jednostki dominującej. to musi być niew GUI. powinien on dziedziczyć NSManagedObject iw pliku .m właściwości należy używać @dynamic zamiast @synthesize. teraz, że masz klasę nadrzędną, że nadszedł czas, aby dostosować W tym celu ustaw klasę nadrzędną na RemoteEntity (w moim przykładzie) zamiast NSManagedObject, a następnie usuń wszelkie właściwości pojawiające się w super klasie (w moim przykładzie "remote_id" i "remote_update").

Oto przykład mojej superklasy https://gist.github.com/1121689.

Mam nadzieję, że to pomoże, czapce kapeluszowej do @deathbob do wskazania tego.

+1

Mam ten sam problem (samotny rodzic, fatalna wydajność) i zastanawiałem się, czy takie podejście, jakie opisujesz, zadziała. Jak radzisz sobie z relacjami z jednostką macierzystą? – edsko

+0

Dzięki! Działa idealnie! W ten sposób masz jeden interfejs w kodzie i wiele tabel w BD (tak jak powinno być) –

+0

To brzmi jak praca wokół czegoś, co powinno zostać zrobione, rzucił gui. Więc może to był błąd z powrotem !? Czy nadal robisz to w ten sposób, czy też zmieniłeś coś od tego czasu? –

4

Hindsight to wspaniała rzecz.

Ponieważ ludzie wciąż czytają ten Q & A i odnoszą się do niego w swoich pytaniach i sądząc, że nic się nie zmieniło, chciałbym dodać kilka komentarzy dla jasności i zapewnić "nowoczesną" lub nowszą odpowiedź.

Podstawowe dane to potężna bestia, ale musisz nauczyć się kontrolować bestię, a dzięki pionierom, którzy wcześniej udzielili odpowiedzi, i ulepszeniom, które Apple wprowadził do ram, dziś jest o wiele łatwiej zrobić niż było kilka lat temu (w szczególności iOS 5).

Początkowo polecam naukę przygotowania solidnego i niezawodnego modelu danych. Istnieje ogromna ilość informacji na ten temat, więc zostawię to czytelnikowi, aby zbadać. Jak wspomniano w poprzednich odpowiedziach, ważne jest, aby nauczyć się przygotowywać wszystkie relacje w modelu danych.

Poza tym istnieje wiele mechanizmów kontrolujących rozmiar zestawu danych, który pobierasz. Nie zostało to mi lepiej wyjaśnione niż w książce z "Pragmatycznej półki" - "Podstawowe dane, druga edycja, przechowywanie danych i zarządzanie dla iOS, OS X i iCloud" (styczeń 2013 r.) Autorstwa Marcusa S. Zarry, a w szczególności Rozdział 4 zatytułowany „Performance Tuning”.

Przeczytaj ją.

+0

Czy możesz wskazać na jakieś aktualizacje w iOS 8+ (Xcode 6+)? – thesummersign

+0

Zaktualizuję odpowiedź – andrewbuilder