Як повинна виглядати система Facebook-Timeline у ​​базі даних?

Як я буду зберігати Користувачів "Повідомлення"? Так що я можу ефективно отримати їх з db, а потім обробляти їх, щоб відображатись хронологічно, коли запитується сторінка певних користувачів?

Чи зберігаю всі повідомлення з усіх користувачів у одній таблиці так:

Post ID | Poster ID | Post Content | Posted to this Users Wall | Post Timestamp

Тоді, коли користувач відкриє Сторінку UserFoo, я просто отримав всі рядки, де Опубліковано для цієї Стінки користувачів = UserFoo ?

Чи не буде зразком вище скласти таблицю громіздкою?

1
@raeq насправді фактична таблиця матиме структуру реляційної бази даних, про яку я намагався вказати, що "у Facebook є мільярд користувачів. Всі ці публікації зберігаються в одній таблиці?" Але, звичайно, деякі його частини зберігаються на іншій таблиці, такі як деталі допису - це одна таблиця, призначення - інше тощо, але знову ж таки "у Facebook є мільярд користувачів. Всі ці публікації зберігаються в одній таблиці?"
додано Автор Jo E., джерело
@raeq насправді фактична таблиця матиме структуру реляційної бази даних, про яку я намагався вказати, що "у Facebook є мільярд користувачів. Всі ці публікації зберігаються в одній таблиці?" Але, звичайно, деякі його частини зберігаються на іншій таблиці, такі як деталі допису - це одна таблиця, призначення - інше тощо, але знову ж таки "у Facebook є мільярд користувачів. Всі ці публікації зберігаються в одній таблиці?"
додано Автор Jo E., джерело
Зробіть окрему таблицю для вмісту публікації, а потім ще одну таблицю для PostRelationships. Один для користувачів (припускаючи, що у вас є). Поштовий зв'язок повинен мати PostID, PosterID, PostPersonsWallID.
додано Автор raeq, джерело
Зробіть окрему таблицю для вмісту публікації, а потім ще одну таблицю для PostRelationships. Один для користувачів (припускаючи, що у вас є). Поштовий зв'язок повинен мати PostID, PosterID, PostPersonsWallID.
додано Автор raeq, джерело
Привіт, що ви маєте на увазі під атрибутом "опубліковано на стіні користувачів"? Він просто зберігає один "цей користувач"? Дякую
додано Автор nathan, джерело
Привіт, що ви маєте на увазі під атрибутом "опубліковано на стіні користувачів"? Він просто зберігає один "цей користувач"? Дякую
додано Автор nathan, джерело

6 Відповіді

users

id | name |

повідомлення

|  id   |   u_id    |   content    |

wall

| id   |   u_id    |  post_id    |

u_id from повідомлення is users.id where it's the Author

u_id from wall is users.id where it's the Target (on which wall is posted)

ви можете називати це набагато чіткіше, наприклад, poster_id, target_id


Інший спосіб - мати

post

| id | poster_id |

wall

| id | post_id  | target_id |

content

|  post_id | content |

You can also add another specific things, such as if the post is a comment or something, in another table, or a column in post table


function getUsersWallPosts($target_id) {
    $query = "SELECT c.content FROM content AS c, INNER JOIN wall AS w ON w.post_id = c.post_id WHERE w.target_id = $target_id";
    $result = someUserDefinedFunctionForQueryAndFetch($query);
    return $result
}
2
додано
+1 Під час видобутку окремих елементів posts пропонує більшу гнучкість, я вважаю, що переміщення вмісту публікації в окремій таблиці є надмірним.
додано Автор RandomSeed, джерело

users

id | name |

повідомлення

|  id   |   u_id    |   content    |

wall

| id   |   u_id    |  post_id    |

u_id from повідомлення is users.id where it's the Author

u_id from wall is users.id where it's the Target (on which wall is posted)

ви можете називати це набагато чіткіше, наприклад, poster_id, target_id


Інший спосіб - мати

post

| id | poster_id |

wall

| id | post_id  | target_id |

content

|  post_id | content |

You can also add another specific things, such as if the post is a comment or something, in another table, or a column in post table


function getUsersWallPosts($target_id) {
    $query = "SELECT c.content FROM content AS c, INNER JOIN wall AS w ON w.post_id = c.post_id WHERE w.target_id = $target_id";
    $result = someUserDefinedFunctionForQueryAndFetch($query);
    return $result
}
2
додано
+1 Під час видобутку окремих елементів posts пропонує більшу гнучкість, я вважаю, що переміщення вмісту публікації в окремій таблиці є надмірним.
додано Автор RandomSeed, джерело

users

id | name |

повідомлення

|  id   |   u_id    |   content    |

wall

| id   |   u_id    |  post_id    |

u_id from повідомлення is users.id where it's the Author

u_id from wall is users.id where it's the Target (on which wall is posted)

ви можете називати це набагато чіткіше, наприклад, poster_id, target_id


Інший спосіб - мати

post

| id | poster_id |

wall

| id | post_id  | target_id |

content

|  post_id | content |

You can also add another specific things, such as if the post is a comment or something, in another table, or a column in post table


function getUsersWallPosts($target_id) {
    $query = "SELECT c.content FROM content AS c, INNER JOIN wall AS w ON w.post_id = c.post_id WHERE w.target_id = $target_id";
    $result = someUserDefinedFunctionForQueryAndFetch($query);
    return $result
}
2
додано
+1 Під час видобутку окремих елементів posts пропонує більшу гнучкість, я вважаю, що переміщення вмісту публікації в окремій таблиці є надмірним.
додано Автор RandomSeed, джерело

Макет, який ви пропонуєте, виглядає розумним. 5 стовпчиків (чотири INT і один TEXT ), це зовсім не "громіздка" таблиця.

Якщо у вас є відповідні індекси, запит WHERE "Опубліковано на стіну користувачів" = "UserFoo" практично миттєво.

Для вашого цільового запиту (показувати хронологічно повідомлення, надіслані на стіну поточного користувача) найкращий індекс, ймовірно, на (опубліковано на стіні користувачів, Post Timestamp) (індекс двох стовпців).

2
додано

Макет, який ви пропонуєте, виглядає розумним. 5 стовпчиків (чотири INT і один TEXT ), це зовсім не "громіздка" таблиця.

Якщо у вас є відповідні індекси, запит WHERE "Опубліковано на стіну користувачів" = "UserFoo" практично миттєво.

Для вашого цільового запиту (показувати хронологічно повідомлення, надіслані на стіну поточного користувача) найкращий індекс, ймовірно, на (опубліковано на стіні користувачів, Post Timestamp) (індекс двох стовпців).

2
додано

Макет, який ви пропонуєте, виглядає розумним. 5 стовпчиків (чотири INT і один TEXT ), це зовсім не "громіздка" таблиця.

Якщо у вас є відповідні індекси, запит WHERE "Опубліковано на стіну користувачів" = "UserFoo" практично миттєво.

Для вашого цільового запиту (показувати хронологічно повідомлення, надіслані на стіну поточного користувача) найкращий індекс, ймовірно, на (опубліковано на стіні користувачів, Post Timestamp) (індекс двох стовпців).

2
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php

IT KPI - Databases
IT KPI - Databases
162 учасників