Это очень просто - возможно, проще, чем вы ожидаете.
Когда вы сохраняете сущность блога, вы, конечно, будете вставлять ее в таблицу основных сущностей.Блог выглядит так:
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 позволят вам сканировать сущности в хронологическом порядке (или обратном хронологическом порядке) и знать, какой набор таблиц индекса соответствует типу сущности данной строки.