Как вы обрабатываете сложные структуры данных (ООП) в БД mySQL? - PullRequest
4 голосов
/ 14 августа 2010

Я попытаюсь проиллюстрировать, что я имею в виду, на примере.

Допустим, вы работаете с сайтом, на котором есть пользователи и разрешены посты.

У вас есть список пользователей, и у каждого пользователя есть:
имя
пароль
выбор темы
ДОЛЖНОСТИ:
- название поста
- время / дата публикации
- сообщение ID
- массив тегов для поста

Идентификатор пользователя / имя / пароль / тема просты. Каждая переменная может быть столбцом, идентификатором auto-incs. Когда я добираюсь до постов, я не уверен, что делать. В приятном дружественном ООП я бы просто сделал тип объекта post и сделал бы массив из них для пользователя. Как я должен сделать это в БД mySQL? Я был шокирован, что это не было первой вещью в моем учебнике, это должно быть чертовски часто. В любом случае, я мог бы сделать ужасно безобразный хак, чтобы заставить его работать, но я бы хотел знать «правильный» способ.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 14 августа 2010

Пользователи:

id    (autoinc)
name
password
theme_id

Сообщения:

id    (autoinc)
member_id
title
date

Теги:

id    (autoinc)
name

Tag_Relations:

tag_id
post_id

Посты - это ваш «массив» постов, в котором столбец member_id связывает каждое сообщение со своим пользователем. Теги - это ваш «массив» тегов. Отношения тегов связывают каждый тег с одним или несколькими сообщениями.

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

SELECT Members.name, Posts.title, Tag_Relations.item_id, Tags.name 
FROM Members LEFT 
JOIN Posts ON Members.id = Posts.member_id 
LEFT JOIN Tag_Relations ON Tag_Relations.post_id = Posts.id 
LEFT JOIN Tags ON Tags.id = Tag_Relations.tag_id 
WHERE Members.id = 2779;

+----------+-----------------------------------+------------+---------+
| name     | title                             | item_recid | name    |
+----------+-----------------------------------+------------+---------+
| Mike     | One Post's Title                  |        973 | Houses! | 
| Mike     | One Post's Title                  |        973 | Cars    | 
| Mike     | One Post's Title                  |        973 | Hats    | 
| Mike     | Another Post's Title              |        973 | Cars    | 
| Mike     | Yet another post                  |        975 | Homes   | 
| Mike     | Guess what?!                      |        976 | Houses! | 
| Mike     | Another one :)                    |        977 | Noses   | 
| Mike     | Another one :)                    |        977 | Mouth   | 
| Mike     | Another one :)                    |        977 | Head    | 
| Mike     | Another one :)                    |        977 | Knees   | 
+----------+-----------------------------------+------------+---------+
1 голос
/ 15 августа 2010

Узнайте о нормальных формах (несколько хороших онлайн-уроков, включая этот ). Механизмы баз данных чрезвычайно эффективны для выполнения операций JOIN между плоскими таблицами, которые были соответствующим образом проиндексированы.

Основная идея заключается в том, что вы идентифицируете сущности в своей базе данных (например, упомянутые вами пользователи / сообщения / темы) и отношения между ними (один к одному, один ко многим или многие ко много). Это позволяет разбить ваши данные на плоские таблицы, которые можно эффективно собрать.

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