2013-04-25 112 views
1

我有一个场景,我不知道该怎么做。将值存储在两个MySQL表中

我有一个网站,用户可以更新他们的状态。我允许使用散列标签,以便可能的用户帖子可能看起来像:

今天去伟大的徒步旅行! #hiking

现在,我打算到后存储在一个适当命名的,其结构是这样的“帖子”表:

post_id | user_id | text | date 

现在,当用户提交其持有的文字后我跑的形式一个脚本来创建一个数组来获取用户使用的所有散列标记项,然后将它们存储在一个数组中。 然后,我可以循环访问该数组,并将标签插入恰当命名的“TAGS”表中。现在这个表的结构是这样的:

tag_id | post_id | user_id | tag 

与此唯一的问题是我不知道的帖子POST_ID,直到我将数据插入到的“信息”表后(POST_ID是主键并且是自动增量)。 现在,我想我可以从该用户的“POSTS”表中选择最后一行数据(插入帖子后),然后依次使用返回的post_id作为我的查询,将标记数据插入到“标签”表。这似乎不是最好的方式?我的问题是:

这是最好的解决方案还是有更好的方法去解决这种情况?

我是Stack Overflow的新品牌,所以请不要投票给我。评论并告诉我我做错了什么,我会学习并提出更好的问题。

感谢

+0

创建一个插入/更新Post的PHP函数会更简单吗?这个函数也会创建/删除旧的标签吗? – 2013-04-25 16:27:46

+1

“不投票”我们呢?大部分时间我们都很友善 – boisvert 2013-04-25 16:44:36

回答

0

在这两个表中都有一个新列 - unique_id - 它包含您在查询数据库之前在代码中生成的字符串。这样您就可以在提交之前将帖子和标签绑定在一起。我一直使用这种方法进行类似的应用。

唯一的问题是唯一性,但有多种方法可以生成唯一的ID(我通常使用时间戳和散列混合)。

+1

这是我的一个想法,我很高兴你这样说!谢谢! – user2320500 2013-04-25 16:35:26

1

你可以得到最后insterted ID得很干脆: mysql_insert_id(),如果你不使用PDO或使用功能lastInsertId()如果你这样做。

0

这种依赖于你正在使用的是哪个版本的mysql,以及你想如何组织你的代码。

选项1.按照你所说的去做。 PHP将包含管理数据库的代码以及数据如何存储到数据库中。我所看到的唯一缺点是,如果在处理hashtags时存在问题,那么可能会有一个插入数据库的帖子,但是hash部分没有成功完成。对于某些应用程序(如银行账户),这可能是不可接受的,这是数据库事务处理的目的。

选项2.处理此问题的另一种方法是编写一个执行插入和处理哈希标记的mysql存储过程。存储过程也可以将整个事件包装在一个事务中,以便数据库保持一致。请注意,这需要支持存储过程的mysql版本。这样做的坏处是你必须在MySQL中编写,这与PHP不同。

mysql和PHP都可以处理这个应用程序逻辑/数据存储逻辑。这是你想如何组织代码的问题。我宁愿保持图层不同。即使你要在PHP中这样做,至少也要有一个单独的类来处理数据库,而不是做其他任何事情。当你的代码变得更大时,有一个单独的类或模块或命名空间来管理这些类型的代码,这使得它们更易于更改和测试。