如何在MySQL数据库中处理复杂数据结构(面向对象编程)?

4

我将用一个例子来说明我的意思。

假设你正在运行一个允许用户发布文章的网站,每个用户都有以下信息:
姓名
密码
主题选择
文章:
- 文章标题
- 发布时间/日期
- 文章ID
- 文章标签数组

用户ID/名称/密码/主题是很容易处理的。每个变量可以成为一列,ID自动增加。但当我到达文章时,我不确定该怎么做。在友好的OOP中,我只需创建一个文章对象类型,并为用户创建一个这些对象的数组。但在mySQL DB中应该如何实现呢?我有点震惊,这不是我教科书中的第一件事情吗?这肯定是非常普遍的。无论如何,我可能会制作一个非常丑陋的hack来使其工作,但我想知道“正确”的方法。

谢谢!


你可能想要看一下NoSql数据库。 - Daniel Moura
3
欢迎来到集合世界——您需要一个多对多的表格来链接“用户”和“帖子”表格记录。 - OMG Ponies
2
这个有什么复杂的?看起来就像你从邮购订购的入门级CMS。 - Vincent Buck
2个回答

8

会员:

id    (autoinc)
name
password
theme_id

文章:

id    (autoinc)
member_id
title
date

标签:

id    (autoinc)
name

标签关系:

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   | 
+----------+-----------------------------------+------------+---------+

这看起来非常低效。除了浪费空间之外,还需要进行搜索处理。为了仅显示一个用户的4篇文章,我必须搜索所有用户的数千篇文章才能找到这4篇文章?并且对于每个帖子上的每个标签(例如每个帖子有4个标签),我还需要搜索另一个数组? - Ambiwlans
2
你不需要在记录中进行“搜索”,而是使用ID来高效地选择所需的记录。数据没有重复,哪里浪费了空间? - Michael Robinson
1
相比于OOP结构的占地面积,由于ID的重复,存在浪费空间,但我想这并不多。在阅读了一些关于SQL的内容后,我意识到select命令是多么高效,所以这不像我最初想象的那样大问题。感谢您的答案和进一步的解释! - Ambiwlans
只要索引/键使用正确,它就很高效 :) 不正确的使用可能会导致查询执行时间非常搞笑... 很乐意帮忙 :) - Michael Robinson
1
所有的都正常工作了:D。想知道你是否有任何关于Web编程工具的建议。目前我只是使用记事本++和我从我的背景(Java / C ++)中知道的良好编程实践。但我完全没有使用测试应用程序或调试软件或测试效率的东西。即使我可以让事情正常工作,谁知道它们在恶劣情况或重负荷下会持续多久...随着项目的发展,我感到有点无助。 - Ambiwlans
1
嗯,我使用Eclipse PDT并使用PHP、Javascript(Prototype库)和MySQL进行工作。对于MySQL,我使用MySQL CLI或phpMyAdmin。为了在浏览器中进行调试和样式测试,我使用Firebug、Web Developer Toolbar和Mac OS X的Digital Colour Meter的组合。对于MySQL查询效率,如果我认为查询太慢,我会手动测试并进行调整,同时我使用mysql_log_slow_queries设置记录超过2秒的查询。愉快的编程! - Michael Robinson

1

了解范式(包括这个在内的几个好的在线教程)。如果适当地建立索引,数据库引擎在执行联接操作时非常高效。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接