Вопросы о MySql SchemaLess Design от FriendFeed - PullRequest
5 голосов
/ 28 июля 2010

Брет Тейлор обсуждал дизайн SchemaLess в этом сообщении в блоге: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

Похоже, они сохранили объекты разных классов только в одной таблице. Затем создайте больше таблиц индекса.

мой вопросэто то, как построить индекс для одного класса.

например, блог пользователя - это {id, userid, title, body}.Твит пользователя: {id, userid, tweet}.

Если я хочу создать индекс для блогов пользователей, как я могу это сделать?

Ответы [ 2 ]

10 голосов
/ 28 июля 2010

Это очень просто - возможно, проще, чем вы ожидаете.

Когда вы сохраняете сущность блога, вы, конечно, будете вставлять ее в таблицу основных сущностей.Блог выглядит так:

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

Вы также вставляете в отдельную таблицу индексов для каждого логического типа атрибута.Используя ваш пример, идентификатор пользователя для блога не совпадает с идентификатором пользователя для твита.Поскольку вы только что вставили блог, вы затем вставляете в индексные таблицы для атрибутов блога:

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

Не вставляйте ни в какие таблицы индекса твита, потому что вы только что создали блог, а нетвит.

Вы знаете все строки в blog_userid ссылочных блогах, потому что именно так вы их вставили.Таким образом, вы можете искать блоги данного пользователя:

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

Re ваш комментарий:

Да, вы можете добавить реальные столбцы в таблицу сущностей для любых известных вам атрибутов.применяются ко всем типам контента.Например:

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

Столбцы для entity_type и creation_date позволят вам сканировать сущности в хронологическом порядке (или обратном хронологическом порядке) и знать, какой набор таблиц индекса соответствует типу сущности данной строки.

0 голосов
/ 21 мая 2011

Они не хранят объекты разных классов в одной таблице.Таблица «сущностей», на которую они ссылаются, используется для хранения только одного вида сущностей.

Например, типичная сущность в FriendFeed может выглядеть следующим образом:

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

Чтобы лучше понять реализацию, взгляните на приведенный здесь пример: https://github.com/jamesgolick/friendly#readme

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...