你如何处理mySQL数据库中的复杂数据结构(OOP)?

时间:2010-08-13 22:03:11

标签: php mysql database oop

我会尝试用一个例子说明我的意思。

假设您正在运行一个拥有用户并允许发帖的网站。

您有一个用户列表,每个用户都有:
一个名字
密码
选择主题
帖子:
  - 职位的标题
  - 发布的时间/日期
  - 帖子ID
  - 帖子的标签数组

用户ID /名称/通行证/主题很简单。每个变量都可以是一个列,ID auto-incs。当我到达帖子时,我不知道该怎么做。在友好的友好OOP中,我只会创建一个post对象类型并为用户创建一个数组。我怎么能在mySQL DB中这样做?我有点震惊的是,这不是我教科书中的第一件事,这一点非常普遍。无论如何,我可能会制作一个非常丑陋的黑客来让它工作,但我想知道'正确'的方式。

谢谢!

2 个答案:

答案 0 :(得分:8)

成员:

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 :(得分:1)

了解normal forms(在线提供的几个好教程,包括this one)。数据库引擎在已正确索引的平面表之间进行JOIN操作非常有效。

基本思想是你识别数据库中的实体(例如你提到的用户/帖子/主题),以及它们之间的关系(一对一,一对多,或多对多)许多)。这允许您将数据拆分为可以有效重新组合的平面表。