2010-07-28 11 views
5

Bret Taylor omówił SchemaLess projekt w tym blogu: http://bret.appspot.com/entry/how-friendfeed-uses-mysqlPytania o FriendFeed za MySql SchemaLess projekt

Wygląda na to, że przechowywanych obiektów do innej klasy jest tylko jeden table.Then budować więcej tabel indeksów.

Moje pytanie brzmi: jak zbudować indeks na jednej klasie.

Na przykład blog użytkownika to {identyfikator, identyfikator użytkownika, tytuł, treść}. Tweet użytkownika to {id, userid, tweet}.

Jeśli chcę utworzyć indeks dla blogów użytkowników, jak mogę to zrobić?

+0

Możesz aby przejrzeć [bazy danych dokumentów] (http://en.wikipedia.org/wiki/Document-oriented_database). Pozwalają one na przechowywanie całych dokumentów, podobnie jak FriendFeed, ale baza danych zajmuje się indeksowaniem. –

Odpowiedz

10

To bardzo proste - być może łatwiejsze niż się spodziewasz.

Podczas przechowywania elementu bloga, oczywiście zostanie wstawiony do tabeli głównych encji. Blog wygląda następująco:

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: ... }' 
); 

Dodaje się również osobną tabelę indeksu dla każdego logicznego typu atrybutu. Na przykładzie, identyfikator użytkownika bloga nie jest taki sam jak identyfikator użytkownika dla tweeta. Ponieważ właśnie włożona bloga, następnie wstawić do tabeli (-ach) indeks dla atrybutu (ów) blogu:

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'); 

nie wolno wkładać do tablic indeksowanych ćwierkać, ponieważ po prostu stworzyła blog, a nie tweet .

Znasz wszystkie wiersze w blogach referencyjnych blog_userid, ponieważ tak je wstawiłeś. Więc można szukać blogów o danym użytkowniku:

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

Re swój komentarz:

Tak, można dodać prawdziwe kolumny do tabeli podmiotom wszelkich atrybutów, które znasz zastosowanie do wszystkich treści typy. Na przykład:

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 
); 

Kolumny ENTITY_TYPE i CREATION_DATE pozwoli Ci czołgać podmiotów w kolejności chronologicznej (lub w odwrotnej kolejności chronologicznej) i wiem, który zestaw tabel indeksu pasuje do typu jednostki danego rzędu.

+0

Ale przyzwyczajam się do tego artykułu. czasami mogą indeksować tabelę encji, aby utworzyć nowy indeks lub zmodyfikować stary indeks. Myślę, że może być dodanie do bloba nowej pary klucz-wartość "typ": "blog" lub "typ": "tweet".Czy jest jakaś lepsza sugestia? – user404017

0

Nie przechowują obiektów z różnych klas w tej samej tabeli. Tabela "encji", do której się odwołują, służy do przechowywania tylko jednego rodzaju jednostek.

Na przykład, typowy podmiot FriendFeed może wyglądać następująco:

"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, 

Aby zrozumieć realizację lepiej, spójrz na przykład podano tutaj: https://github.com/jamesgolick/friendly#readme

+0

Uważam, że dokładnie to robią (przechowuj obiekty różnych typów w tym samym stole). Jeśli spojrzysz na link z oryginalnego postu, to mówi: "nasze jednostki są przechowywane w TABELI, która wygląda tak ... TABLE entity". Treść encji podana przez użytkownika znajduje się w polu body tabeli encji. Myślę, że o to chodzi w całym projekcie, czy czegoś brakuje? – riley

+0

Tak, czegoś brakuje. Jest to jeden rodzaj bytu. Korzystają one z konstrukcji bez schematu, dzięki czemu mogą dodawać i usuwać kolumny bez blokowania stołu. Wszystkie jednostki są takie same, z wyjątkiem elementów, które istniały przed dodaniem pola, nie mają tego konkretnego pola w swoim JSON. –