2010-07-28 35 views
5

Bret Taylor FriendFeed của thảo luận về thiết kế SchemaLess trong bài viết trên blog này: http://bret.appspot.com/entry/how-friendfeed-uses-mysqlCác câu hỏi về MySql SchemaLess Thiết kế

Dường như họ lưu trữ các đối tượng lớp khác nhau của thành chỉ có một table.Then xây dựng nhiều bảng chỉ mục.

câu hỏi của tôi là cách xây dựng chỉ mục trên một lớp. Ví dụ:

ví dụ, blog của người dùng là {id, userid, title, body}. Tweet của người dùng là {id, userid, tweet}.

Nếu tôi muốn xây dựng chỉ mục cho blog của người dùng, tôi có thể làm gì?

+0

Bạn có thể muốn xem [cơ sở dữ liệu tài liệu] (http://en.wikipedia.org/wiki/Document-oriented_database). Chúng cũng cho phép bạn lưu trữ toàn bộ tài liệu, giống như FriendFeed, nhưng cơ sở dữ liệu sẽ xử lý tất cả các chỉ mục cho bạn. –

Trả lời

10

Rất đơn giản - có lẽ đơn giản hơn bạn mong đợi.

Khi bạn lưu trữ một thực thể blog, bạn sẽ chèn vào bảng thực thể chính của khóa học. Blog giống như sau:

CREATE TABLE entities (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    entity_json TEXT NOT NULL 
); 

INSERT INTO entities (id, entity_json) VALUES (DEFAULT, 
    '{userid: 8675309, 
     post_date: "2010-07-27", 
     title: "MySQL is NoSQL", 
     body: ... }' 
); 

Bạn cũng chèn vào bảng chỉ mục riêng cho từng loại thuộc tính hợp lý. Sử dụng ví dụ của bạn, userid cho blog không giống như userid cho một tweet. Kể từ khi bạn muốn chèn một blog, bạn sau đó chèn vào bảng chỉ mục (s) cho blog của thuộc tính (s):

CREATE TABLE blog_userid (
    id INT NOT NULL PRIMARY KEY, 
    userid BIGINT UNSIGNED, 
    KEY (userid, id) 
); 

INSERT INTO blog_userid (id, userid) VALUES (LAST_INSERT_ID(), 8675309); 

CREATE TABLE blog_date (
    id INT NOT NULL PRIMARY KEY, 
    post_date DATETIME UNSIGNED, 
    KEY (post_date, id) 
); 

INSERT INTO blog_date (id, post_date) VALUES (LAST_INSERT_ID(), '2010-07-27'); 

Đừng chèn vào bất kỳ bảng chỉ số tweet, bởi vì bạn vừa tạo một blog, không phải là một tweet .

Bạn biết tất cả các hàng trong blog_userid blog tham chiếu, vì đó là cách bạn chèn chúng. Vì vậy, bạn có thể tìm kiếm các blog của một người dùng nhất định:

SELECT e.* 
FROM blog_userid u JOIN entities e ON u.id = e.id 
WHERE u.userid = 86765309; 

Re bình luận của bạn:

Vâng, bạn có thể thêm các cột thực vào bảng đơn vị đối với bất kỳ thuộc tính mà bạn biết áp dụng đối với tất cả nội dung loại. Ví dụ:

CREATE TABLE entities (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    entity_type INT NOT NULL, 
    creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    entity_json TEXT NOT NULL 
); 

Các cột cho ENTITY_TYPE và CREATION_DATE sẽ cho phép bạn thu thập dữ liệu thực thể trong thứ tự thời gian (hoặc đảo ngược thứ tự thời gian) và biết được tập hợp các bảng chỉ số phù hợp với loại thực thể của một hàng nhất định.

+0

Nhưng accroding cho bài viết. đôi khi họ có thể thu thập dữ liệu bảng thực thể để tạo chỉ mục mới hoặc sửa đổi chỉ mục cũ. Tôi nghĩ có thể thêm khóa-giá trị "loại" mới: "blog" hoặc "loại": "tweet" vào đốm màu.Có đề xuất nào tốt hơn? – user404017

0

Chúng không lưu trữ các đối tượng của các lớp khác nhau trong cùng một bảng. Bảng 'các thực thể' mà chúng đang đề cập đến được sử dụng để lưu trữ chỉ một loại thực thể.

Ví dụ, một đơn vị điển hình trong FriendFeed có thể trông như thế này:

"id": "71f0c4d2291844cca2df6f486e96e37c", 
"user_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"feed_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"title": "We just launched a new backend system for FriendFeed!", 
"link": "http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c", 
"published": 1235697046, 
"updated": 1235697046, 

Để hiểu được thực hiện tốt hơn, đã nhìn vào ví dụ đưa ra ở đây: https://github.com/jamesgolick/friendly#readme

+0

Tôi tin đó chính xác là những gì họ làm (lưu trữ các đối tượng thuộc các loại khác nhau trong cùng một bảng). Nếu bạn nhìn vào liên kết từ bài viết gốc nó nói 'thực thể của chúng tôi được lưu trữ trong A TABLE trông giống như thế này .... TABLE thực thể'. Nội dung thực thể bạn đưa ra một ví dụ về được chứa trong trường nội dung của bảng thực thể. Tôi nghĩ đó là toàn bộ quan điểm của thiết kế, tôi có thiếu gì đó không? – riley

+0

Có bạn đang thiếu một cái gì đó. Một loại thực thể của nó. Họ sử dụng thiết kế ít lược đồ hơn để họ có thể thêm và xóa cột mà không khóa bảng. Tất cả các thực thể đều giống nhau ngoại trừ các thực thể tồn tại trước khi một trường được thêm vào không có trường cụ thể đó trong JSON của chúng. –