2011-08-02 33 views
25

Tôi đang tạo một khung làm việc với Dữ liệu Chính. Một trong những yêu cầu để sử dụng khung làm việc của tôi trên lớp Dữ liệu cốt lõi của bạn là bất kỳ thực thể nào bạn muốn có khả năng của Khung sẽ cần phải là các thực thể con và các lớp con của thực thể mà tôi cung cấp cho bạn. Vì mục đích này, tôi sẽ gọi đối tượng đó là Foo.Hiệu suất Dữ liệu Chính với Thực thể Đơn lẻ

Hôm nay tôi nhận ra rằng Core Data lưu trữ tất cả các đối tượng là thực thể con của Foo vào một bảng có tên là ZFOO. Tôi lo lắng về hiệu suất của Core Data nếu ai đó có bộ dữ liệu khổng lồ muốn sử dụng nó, vì tất cả các thực thể con của lớp foo sẽ được lưu trữ trong một bảng ZFOO khổng lồ.

Bất kỳ ý kiến ​​hay đề xuất nào sẽ được đánh giá cao.

+2

Yeah, lớp con nói chung là xấu trong CoreData nếu bạn có tập dữ liệu lớn kể từ khi bạn có thể kết thúc với rất phân tích bảng. Tuy nhiên, đề nghị của tôi là để kiểm tra đầu tiên ... Viết một ứng dụng đơn giản, tạo ra hàng nghìn đối tượng của nhiều lớp con khác nhau của lớp Foo của bạn và xem cách hệ thống hoạt động như thế nào.Nếu nó không đáng chú ý thì có thể bạn vẫn ổn, hãy kiểm tra trước khi đưa ra các giả định về tốc độ –

+0

Cảm ơn Tôi đã tìm kiếm những câu chuyện kinh dị về điều này rất sai. Tôi càng đọc càng nhiều Apple dường như thực sự khuyến khích loại thừa kế này trong Core Data. – cruffenach

+1

Tôi có thể xác nhận rằng nó vẫn thực hiện điều này trong Xcode 5 DP5. – sudo

Trả lời

28

Năm ngoái, tôi đã làm việc trên một dự án đã làm điều tương tự, chúng tôi lưu trữ mọi thứ trong dữ liệu lõi và mọi thứ trong dữ liệu lõi được kế thừa từ một lớp duy nhất có một số thuộc tính chung.

Chúng tôi đã ở đâu đó giữa các bản ghi 1k - 10k trong dữ liệu lõi và hiệu suất bị xuống cấp đến điểm chúng tôi viết lại và loại bỏ tổ tiên chung. Khi tôi nhớ lại các tìm kiếm đơn giản đã mất nhiều giây, và chèn/cập nhật cũng khá crappy. Đó là chỉ sau khi mọi thứ đã nhận được đau đớn chậm mà chúng tôi nứt db mở và nhận thấy dưới lõi bao gồm dữ liệu đã được lưu trữ tất cả mọi thứ trong một bảng. Xin lỗi, tôi không nhớ số cụ thể, takeaway lớn là chúng tôi đã phải làm lại nó vì nó quá chậm, và không quá chậm như quá chậm cho giao dịch tần số cao nhưng quá chậm như các ứng dụng bị rơi khi tải khi cố gắng để đưa ra chế độ xem ban đầu từ dữ liệu cốt lõi.

Vì vậy, với hạt muối mà trên iOS cũ và phần cứng cũ hơn, tôi chắc chắn sẽ không làm điều này.

+2

Apple khuyến nghị, trong một trong các video Core Data nâng cao của họ, không phải cho các thực thể phân lớp trong Dữ liệu chính. – Moshe

+0

+1 Cảm ơn Deathbob và @Christopher Bradford - cả hai bạn đã cứu tôi rất nhiều rắc rối sau khi tôi phát hiện điều này đã xảy ra trong giai đoạn đầu của việc phát triển một ứng dụng! – Rog

+0

Vấn đề rất khó chịu. Tôi đã tạo một lớp con của một đối tượng được quản lý và dự kiến ​​có thể đặt chúng trong các bảng riêng biệt. Hoàn toàn tàn phá quan điểm của bảng khi chúng được tìm nạp cùng nhau! Có thực sự không có cách nào để tách chúng? – sudo

36

Tôi đã làm việc với @deathbob trong dự án này làm khách hàng tiềm năng iOS. Trong trường hợp của chúng tôi, tôi có nhiều lớp chứa các thuộc tính "remote_id" và "remote_update". Ban đầu tôi thiết lập các bảng bằng cách sử dụng các lớp con. Tôi đã có một thực thể trừu tượng "RemoteEntity" chứa các thuộc tính đó và một loạt các thực thể khác được thừa hưởng từ nó, mỗi thực thể có riêng của chúng. Tôi nghĩ rằng chúng tôi sẽ kết thúc với một loạt các bảng với remote_id, remote_update và sau đó là thuộc tính tùy chỉnh của chúng. Thay vào đó, chúng tôi đã kết thúc với bảng lớn mà bạn mô tả.

Sửa chữa khá đơn giản, phải không thiết lập kế thừa thông qua GUI. Thay vào đó bao gồm tất cả các thuộc tính cho đối tượng đó bao gồm các thuộc tính được chia sẻ của bạn trong trình soạn thảo Core Data (điều này có nghĩa là "remote_id" và "remote_update" sẽ xuất hiện trong mỗi thực thể. lớp của thực thể cha.Điều này phải là không phải là trong GUI. Nó phải được kế thừa từ NSManagedObject và trong tệp .m thuộc tính nên sử dụng @dynamic thay vì @synthesize. Bây giờ bạn có lớp cha, đã đến lúc điều chỉnh Đặt lớp cha mẹ thành RemoteEntity (trong ví dụ của tôi) thay vì NSManagedObject, sau đó loại bỏ bất kỳ thuộc tính nào xuất hiện trong lớp siêu hạng của bạn (trong ví dụ của tôi là "remote_id" và "remote_update")

Đây là một ví dụ của lớp siêu của tôi https://gist.github.com/1121689.

Tôi hy vọng điều này sẽ giúp ích cho bạn, hãy chuyển sang @deathbob để chỉ ra điều này.

+1

Tôi đang gặp vấn đề tương tự (thực thể cha đơn, hiệu suất khủng khiếp) và tự hỏi liệu một cách tiếp cận giống như cách bạn mô tả có hoạt động không. Làm thế nào để bạn đối phó với các mối quan hệ với thực thể cha mẹ? – edsko

+0

Cảm ơn! Nó hoạt động hoàn hảo! Bằng cách này bạn có một giao diện trong mã, và nhiều bảng trong BD (vì nó phải là) –

+0

Điều này nghe giống như một công việc xung quanh một cái gì đó cũng nên được thực hiện ném gui. Vì vậy, nó có thể là một lỗi trở lại hơn !? Bạn vẫn làm điều đó theo cách đó hoặc đã làm một cái gì đó thay đổi từ hơn? –

4

Cảnh báo là một điều tuyệt vời.

Khi mọi người vẫn đang đọc Q & A và đề cập đến nó trong câu hỏi của họ và nghĩ rằng không có gì thay đổi, tôi muốn thêm một vài nhận xét cho rõ ràng và cung cấp phản hồi "hiện đại" hoặc gần đây hơn.

Dữ liệu cốt lõi là một con thú mạnh mẽ, nhưng bạn phải học cách kiểm soát con thú, và nhờ những người tiên phong đã trả lời trước đó và những cải tiến mà Apple đã thực hiện cho khung công tác, hôm nay dễ dàng hơn nhiều đã được một vài năm trước đây (đặc biệt là iOS 5).

Ban đầu, tôi khuyên bạn nên tìm hiểu cách chuẩn bị mô hình dữ liệu vững chắc và mạnh mẽ. Có một lượng thông tin khổng lồ về điều này vì vậy tôi sẽ để nó cho người đọc để điều tra. Như các câu trả lời trước đây đề cập đến, điều quan trọng là phải học cách chuẩn bị tất cả các mối quan hệ trong mô hình dữ liệu.

Ngoài ra, có một số cơ chế để kiểm soát kích thước của tập dữ liệu bạn tìm nạp. Nó không được giải thích tốt hơn cho tôi hơn là trong một cuốn sách từ The Pragmatic Bookshelf - "Dữ liệu cốt lõi, 2nd Edition, lưu trữ dữ liệu và quản lý cho iOS, OS X và iCloud" (tháng 1 năm 2013) bởi Marcus S. Zarra, và đặc biệt Chương 4 với tựa đề "Performance Tuning”.

đọc nó.

+0

Bạn có thể trỏ đến một số cập nhật trong iOS 8+ (Xcode 6+) không? – thesummersign

+0

Tôi sẽ cập nhật câu trả lời – andrewbuilder

Các vấn đề liên quan