2010-11-06 41 views
12

Trong Nhiệm vụ của tôi để hiểu Mnesia, tôi vẫn đấu tranh với suy nghĩ trong các thuật ngữ quan hệ. Vì vậy, tôi sẽ đặt cuộc đấu tranh của tôi lên đây và yêu cầu cách tốt nhất để giải quyết chúng.Giúp tôi hiểu mô hình Mnesia (NoSQL)

one-to-many-quan hệ Nói rằng tôi có một nhóm người,

-record(contact, {name, phone}). 

Bây giờ, tôi biết rằng tôi có thể xác định điện thoại để luôn luôn được lưu dưới dạng danh sách, để mọi người có thể có nhiều số điện thoại, và tôi cho rằng đó là cách để làm điều đó (là nó? Làm thế nào sau đó tôi sẽ nhìn này theo cách khác xung quanh, nói, tìm một tên cho một số?). .

nhiều-nhiều-quan hệ bây giờ hãy giả sử tôi có nhiều nhóm tôi có thể đưa người dân ở Tên nhóm không có bất kỳ ý nghĩa, họ chỉ là tên; khái niệm là "nhóm hệ thống Unix" hoặc "nhãn". Tuy nhiên, tôi sẽ mô hình thành viên này là một nhà tư vấn, chẳng hạn như

{groups [{friends, bool()}, {family, bool()}, {work, bool()}]} %% and so on... 

dưới dạng một trường trong bản ghi "liên hệ" ở trên. Cách tốt nhất để mô hình hóa điều này trong mnesia là gì nếu tôi muốn có thể tra cứu tất cả các thành viên của một nhóm dựa trên tên nhóm một cách nhanh chóng, và cũng muốn có thể tra cứu tất cả các nhóm cá nhân được đăng ký? Tôi cũng chỉ có thể mô hình hóa nó như là một danh sách chứa tất cả các định danh nhóm. Để sử dụng với chứng mất trí, cách tốt nhất để mô hình hóa điều này là gì?

Tôi xin lỗi nếu câu hỏi này câm. Có rất nhiều tài liệu về chứng mất trí nhớ, nhưng nó thiếu (IMO) một số ví dụ tốt cho việc sử dụng tổng thể.

+1

Không cần phải xin lỗi IMHO câu hỏi không phải là câm ở tất cả 1 cho rằng –

Trả lời

3

Đối với ví dụ đầu tiên, hãy xem xét hồ sơ này:

-record(contact, {name, [phonenumber, phonenumber, ...]}). 

contact là một kỷ lục với hai lĩnh vực, namephone nơi điện thoại là một danh sách các số điện thoại.Do user425720 cho biết có thể lưu trữ chúng như một thứ gì đó khác với chuỗi, ví dụ, nếu bạn có yêu cầu cực đối với dung lượng lưu trữ nhỏ.

Bây giờ ở đây có một phần khó có thể "có được" với các cửa hàng có giá trị quan trọng: bạn cũng cần phải lưu trữ mối quan hệ nghịch đảo. Nói cách khác, bạn cần một cái gì đó tương tự như sau:

-record(phone, {phonenumber, contactname}). 

Nếu bạn có một lớp trong ứng dụng của bạn để xử lý cơ sở dữ liệu trừu tượng lập tức, bạn có thể làm cho nó luôn luôn thêm/thay đổi hồ sơ điện thoại khi thêm/thay đổi một số liên lạc .

-

Đối với ví dụ thứ hai, hãy xem xét hai kỷ lục sau đây:

-record(contact, {uuid, name, [group_id, group_id]}). 
-record(group, {uuid, name, [contact_id, contact_id]}). 

Cách đơn giản nhất là chỉ cần lưu trữ id trỏ đến các hồ sơ liên quan. Vì Mnesia không có khái niệm về tính toàn vẹn tham chiếu, điều này có thể không đồng bộ nếu bạn xóa một nhóm mà không xóa nhóm đó khỏi tất cả người dùng.

Nếu bạn cần lưu trữ các loại nhóm trên hồ sơ liên hệ, bạn có thể sử dụng như sau:

-record(contact, {name, [{family, [group_id, group_id]}, {work, [..]}]}). 

-

Vấn đề thứ hai bạn cũng có thể được giải quyết bằng cách sử dụng một kỷ lục trung gian, mà bạn có thể nghĩ là "thành viên".

-record(contact, {uuid, name, ...}). 
-record(group, {uuid, name, ...}). 
-record(membership, {contact_uuid, group_uuid}). # must use 'bag' table type 

Có thể có bất kỳ số lượng hồ sơ "thành viên" nào. Sẽ có một bản ghi cho mọi nhóm người dùng.

+0

Tôi sẽ chấp nhận câu trả lời này. Cảm ơn. –

-1

Trước hết, bạn yêu cầu patters thiết kế cửa hàng giá trị khóa. Hoàn toàn ổn. Trước khi tôi sẽ cố gắng trả lời câu hỏi của bạn cho phép làm rõ - Mnesia là gì. Nó là k-v DB, được bao gồm trong OTP. Bởi vì nó là bản địa, nó rất thoải mái để sử dụng từ Erlang. Nhưng hãy cẩn thận. Đây là cơ sở dữ liệu cũ với các giả định rất cổ đại (ví dụ: phân phối dữ liệu với băm tuyến tính). Vì vậy, hãy tiếp tục, tìm hiểu và chơi với nó, nhưng để sản xuất mất thời gian của bạn và duyệt qua cửa hàng NoSQL để tìm ra sản phẩm tốt nhất cho nhu cầu của bạn.

ví dụ về @telephone. Không lưu trữ các công cụ dưới dạng chuỗi (list()) - nó rất nặng đối với GC. Tôi sẽ tạo một số trường giống như phone_1 :: < < nhị phân>>, phone_2 :: < < nhị phân>>, phone_extra :: [< < nhị phân>>] và tạo chỉ mục trên trường truy vấn thường xuyên nhất. Các dấu hiệu của chứng mất trí cũng phức tạp - khi nút bị hỏng và tăng lên, chúng cần phải tự xây dựng lại (có thể mất rất nhiều thời gian).

@ ví dụ gia đình. Nó khá khó với không gian tên phẳng. Bạn có thể chơi với các phím phức tạp hơn .. Có thể tạo bảng riêng biệt cho TheGroup và giữ số nhận dạng của các thành viên? Hoặc mỗi thành viên sẽ có id của các nhóm anh ấy thuộc về (khó duy trì ..). Nếu bạn muốn nhận ra bạn bè tôi sẽ thực hiện một số loại hợp đồng trước khi trình bày dữ liệu (A là bạn B của B là bạn của A) - cách tiếp cận này sẽ đối phó với sự nhất quán cuối cùng và xung đột trong dữ liệu.

+0

heh, có lẽ một số bình luận trước khi downvote này? – user425720

+0

Trong khi tôi không bầu bạn xuống, có vẻ như rõ ràng với tôi rằng bạn đã không nhận được những gì tôi đã hỏi trong câu hỏi thứ hai (hoặc tôi đã không làm cho nó rõ ràng đủ). Tôi muốn mô hình mối quan hệ nhiều-nhiều; "gia đình" và "bạn bè" không đề cập đến bất kỳ khái niệm cụ thể nào. Tôi cũng đã chỉ ra rằng danh sách với các thành viên là một cách, nhưng yêu cầu một cách tốt hơn. –

+0

vâng, nev. Tuy nhiên, ví dụ tuple của bạn dường như là những gì tôi viết ở phần thứ hai. Phần đầu tiên nói để mô hình nhiều-nhiều như bàn phím nắm giữ riêng biệt của các thành viên. Nó phụ thuộc vào DB. Ở Riak có cấu trúc khóa 2 cấp (thùng, khóa) - (giá trị) để bạn có thể có tất cả thành viên goup trong một nhóm. Từ định nghĩa KV cửa hàng không tốt trong việc đại diện cho quan hệ. – user425720

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