2014-10-28 14 views
9

Tôi nhận ra điều này có thể là cảm giác chung đối với nhiều người, vì vậy xin lỗi nếu điều này có vẻ giống như một câu hỏi ngu ngốc."Dữ liệu cốt lõi không phải là một cơ sở dữ liệu quan hệ." Tại sao chính xác điều này lại quan trọng?

Tôi đang cố gắng tìm hiểu dữ liệu cốt lõi cho lập trình iOS và tôi đã đọc và nghe nhiều lần nói rằng Dữ liệu cốt lõi (CD) không phải là cơ sở dữ liệu quan hệ. Nhưng rất ít người khác được nói về điều này, hoặc tại sao chính xác điều quan trọng là phải biết ngoài một ý nghĩa học thuật. Tôi có nghĩa là bạn có thể sử dụng đĩa CD như thể nó là một cơ sở dữ liệu cho hầu hết mọi thứ - lưu trữ và tìm nạp dữ liệu, truy vấn runnings ... Từ sự hiểu biết sơ bộ về nó, tôi không thực sự thấy nó khác với cơ sở dữ liệu.

Tôi không đặt câu hỏi thực tế là sự khác biệt là quan trọng. Tôi tin rằng rất nhiều người thông minh sẽ không lãng phí thời gian của họ vào thời điểm này nếu nó không hữu ích để hiểu. Nhưng tôi muốn một người nào đó vui lòng giải thích - lý tưởng nhất là với các ví dụ - cách CD không phải là một cơ sở dữ liệu quan hệ ảnh hưởng đến cách chúng ta sử dụng nó như thế nào? Hoặc có lẽ, nếu tôi không nói rằng đĩa CD không phải là một cơ sở dữ liệu quan hệ, điều này sẽ ảnh hưởng xấu đến hiệu suất của tôi như một lập trình viên Objective-C/Swift như thế nào?

Có những điều mà người ta có thể cố gắng làm không chính xác nếu họ coi CD là cơ sở dữ liệu quan hệ không? Hoặc, có những thứ mà một cơ sở dữ liệu quan hệ không thể thực hiện hoặc làm tốt hơn CD được thiết kế để làm?

Cảm ơn tất cả vì sự khôn ngoan tập thể của bạn.

Trả lời

11

Mọi người nhấn mạnh góc "không phải cơ sở dữ liệu quan hệ" vì những người có trải nghiệm cơ sở dữ liệu dễ bị lỗi cụ thể với Dữ liệu cốt lõi do cố gắng áp dụng trực tiếp trải nghiệm của họ. Một số ví dụ:

  • Tạo các đối tượng thực chất là các bảng nối SQL. Điều này gần như không bao giờ cần thiết và thường làm cho mọi thứ phức tạp hơn và dễ bị lỗi. Core Data hỗ trợ trực tiếp nhiều mối quan hệ.
  • Tạo một trường ID duy nhất trong thực thể vì chúng nghĩ rằng chúng cần một trường để đảm bảo tính duy nhất và tạo mối quan hệ. Đôi khi tạo ID duy nhất tùy chỉnh hữu ích, thường thì không.
  • Thiết lập mối quan hệ giữa các đối tượng dựa trên các ID duy nhất này thay vì sử dụng các mối quan hệ Dữ liệu cốt lõi - tức là lưu ID duy nhất của đối tượng liên quan thay vì sử dụng ngữ nghĩa ObjC/Swift để liên kết các đối tượng.

Dữ liệu cốt lõi có thể và thường hoạt động dưới dạng cơ sở dữ liệu, nhưng suy nghĩ về cơ sở dữ liệu quan hệ khác là cách hay để sửa lỗi.

+0

Làm thế nào để bạn thường xác định xem hai lớp con 'NSManagedObject' có đại diện cho các bản ghi giống hệt nhau không có ID duy nhất không? –

+2

'NSManagedObject' có trường' objectID' được tích hợp sẵn phục vụ cho mục đích này. Bạn thường không cần phải tạo một ID vì bạn đã có một ID. –

+0

Tôi nghĩ đó là thiết bị trên mỗi thiết bị, vì vậy nếu dữ liệu của bạn di chuyển đến hoặc đồng bộ với một thiết bị khác thay đổi. (Tôi đoán rằng có thể rơi vào vòng loại "đôi khi" của bạn - Tôi không chắc chắn có bao nhiêu ứng dụng làm điều này.) –

7

Core Data là một công nghệ với nhiều tính năng mạnh mẽ và các công cụ như:

  1. Thay đổi theo dõi (undo/redo)
  2. Faulting (không phải tải toàn bộ đối tượng mà có thể tiết kiệm bộ nhớ)
  3. Persistence

danh sách đi ..

Phần kiên trì của dữ liệu lõi được hỗ trợ bởi SQLite, là một cơ sở dữ liệu quan hệ. Một trong những lý do tôi nghĩ mọi người nhấn mạnh rằng Core Data không phải là một cơ sở dữ liệu quan hệ bởi vì nó có nhiều hơn là chỉ bền bỉ, và có thể tận dụng lợi thế mà không cần sử dụng sự bền bỉ nào cả.

Bằng cách xử lý Dữ liệu cốt lõi làm cơ sở dữ liệu quan hệ, tôi giả sử bạn có nghĩa là mối quan hệ giữa các đối tượng được ánh xạ theo id, tức là khách hàng có customerId và sản phẩm có productId. Điều này chắc chắn sẽ không chính xác vì Dữ liệu cốt lõi cho phép bạn xác định mối quan hệ mạnh mẽ giữa các mô hình đối tượng giúp mọi thứ dễ quản lý. Ví dụ: nếu bạn muốn khách hàng của mình có nhiều sản phẩm và muốn xóa tất cả các sản phẩm đó khi bạn xóa khách hàng, Dữ liệu cốt lõi cung cấp cho bạn khả năng thực hiện điều đó mà không phải quản lý customerIds/productIds và tìm hiểu cách định dạng các truy vấn SQL phức tạp để phù hợp với mô hình trong bộ nhớ của bạn. Với Core Data, bạn chỉ cần cập nhật mô hình của mình và lưu ngữ cảnh của bạn, SQL được thực hiện cho bạn dưới mui xe. (Trong thực tế, bạn thậm chí có thể bật gỡ lỗi để in ra dữ liệu lõi SQL đang thực hiện cho bạn bằng cách chuyển '-com.apple.CoreData.SQLDebug 1' làm đối số khởi chạy.

Về mặt hiệu suất, Dữ liệu cốt lõi làm một số tối ưu hóa nghiêm trọng dưới mui xe giúp việc truy cập dữ liệu trở nên dễ dàng hơn nhiều mà không phải đi sâu vào SQL, đồng thời hoặc xác thực.

+0

Giải thích tốt Cảm ơn .. – Manoj

0

I THINK vấn đề là khác với cơ sở dữ liệu quan hệ và cố gắng áp dụng các kỹ thuật quan hệ sẽ dẫn đến việc nhà phát triển lạc lối như những người khác đã đề cập. Nó thực sự hoạt động ở mức cao hơn bằng cách trừu tượng hóa chức năng của cơ sở dữ liệu quan hệ trong mã của bạn.

Sự khác biệt chính, từ quan điểm lập trình, là bạn không cần số nhận dạng duy nhất vì dữ liệu lõi chỉ xử lý điều đó. Nếu bạn đã cố gắng để tạo của riêng bạn, bạn sẽ đến để thấy rằng họ là dư thừa và rất nhiều rắc rối thêm. Từ quan điểm của lập trình viên, bất cứ khi nào bạn truy cập vào một bản ghi "thực thể", bạn sẽ có một con trỏ tới bất kỳ mối quan hệ nào - có thể là một con trỏ duy nhất cho mối quan hệ "một-một", hoặc một bộ các con trỏ tới các bản ghi trong đó. Quay trở lại mối quan hệ "to-nhiều". Core Data xử lý việc thu hồi các "bản ghi" thực sự khi bạn sử dụng một trong các con trỏ.

Vì dữ liệu lõi xử lý hiệu quả các lỗi (trong đó "bản ghi" (đối tượng) được tham chiếu bởi một con trỏ không có trong bộ nhớ), bạn không phải lo lắng về bản thân. Khi chúng được chương trình Core Data của bạn cần, chúng sẽ làm cho chúng có sẵn.

Vào cuối ngày, nó cung cấp chức năng tương tự nhưng dưới mui xe thì khác. Nó đòi hỏi một số suy nghĩ khác nhau trong SQL bình thường không có ý nghĩa trong bối cảnh của dữ liệu cốt lõi như SQL (trong trường hợp của một cửa hàng sqlite) được xử lý cho bạn.

Các điều chỉnh chính đối với tôi khi chuyển sang Dữ liệu chính đã được lưu ý - loại bỏ khái niệm số nhận dạng duy nhất. Họ đang đi phía sau hậu trường nhưng bạn không bao giờ phải lo lắng về họ và không nên cố gắng để xác định của riêng bạn. Điều chỉnh thứ hai cho tôi là bất cứ khi nào bạn cần một đối tượng có liên quan đến bạn, bạn chỉ cần lấy nó bằng cách sử dụng (các) con trỏ thích hợp trong đối tượng thực thể bạn đã có.

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