在SQL中组织用户输入的用户输入用户输入

时间:2011-07-17 18:56:28

标签: php mysql sql

首先是一些背景故事:

我正在创建一个网站(与我的队友一起),用户必须能够创建“概念”(包括时间戳,创建它的用户,标题,描述,摘要等等)。在所述概念上,人们必须能够发布“想法”(时间戳,创建者的IP,文本)。最后,人们必须能够对想法发表评论(其中包含与想法相同的内容)。

tl; dr:我们正在构建一个类似于StackOverflow的基础架构:其中有3层(缺少更好的词)用户输入:问题,问题答案和对这些答案的评论。

最初,我和我的队友正在考虑做的是为所有概念设置一个表,然后每个概念也会有一个标题为<the concept's id in the table>_ideas的表。然后每个想法将在该表中获得一行,另一个表标题为<the concept's id in the table>_<idea id in the concepts's id table>_ideas然而,对此进行的一些快速测试表明,我们收到了垃圾邮件表......

因此我们需要重新构建当前的SQL,我们当前的想法只是将表格与想法和注释结合起来,并在该表格中创建一个额外的字段,表示该行是一个想法还是评论。

但是,在我们做任何事情之前,我想把问题抛到堆栈溢出处:

组织三个SQL数据的最佳方式是什么(我的意思是最快)?

6 个答案:

答案 0 :(得分:2)

  

每个概念也会有一个表

表并不是动态元素。当然,他们可以,但是认真。

关系数据库结构具有静态数量的表。

请阅读fundamentals of relational database design

是否在一个表中组合不同的实体,并添加一个字段来区分它们的问题是非常有效的问题。

最后我认为归结为应用程序。它可以严重加速事情,但也会减速。我更喜欢单独的表,因为你保存了一个索引,并且可以更容易地使用格式分片。 UNION声明很便宜。

话说。从固定对象开始,为它们创建表。

为“概念”创建一个表,一个用于“ideas”,一个用于“comments”,一个用于“用户”等...

评论获得了一个“想法”的字段,其中包含了它们的想法等等。

答案 1 :(得分:1)

使用数据库关系。您的三个表格为conceptideacomment。每个概念都有很多想法,每个想法都有很多评论(虽然我发现它更直观,所以说“每个想法都与一个概念有关,每个评论都与一个想法有关”)。

您的表格如下所示:

concept: id timestamp title user_id
idea: id timestamp ip text concept_id user_id
comment: id text idea_id comment_id
user: id username ....

您的id字段是主要的auto_incrementing键(您可以在phpMyAdmin中设置它)。例如,评论表中的idea_id会将评论与想法联系起来。选择关于提示10的所有评论:SELECT * FROM comment WHERE idea_id=10

您可以使用SQL join queries执行更复杂的操作。

答案 2 :(得分:1)

通常,实现主题/响应/子注释类型结构的方法是使用三个具有外键的表:

  1. 概念表:
    • 主键
    • 名称
    • 时间戳
    • user_id
    • ......无论
  2. 想法表:
    • 主键
    • 引用概念表主键的键
    • 名称
    • 时间戳
    • user_id
    • ......无论
  3. 评论表:
    • 主键
    • 引用Ideas表主键的键
    • 引用Concepts表主键的键(可选)
    • 名称
    • 时间戳
    • user_id
    • ......等等

答案 3 :(得分:1)

我会使用三个不同的表和外键来链接它们。但是你也可以通过在comment表上设置一个'parent'-row来嵌套注释(或其他),这是该表主键的外键。

CREATE TABLE IF NOT EXISTS `comment` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_comment` int(11) DEFAULT NULL COMMENT 'allows commenting on comments (annotations)',
  `user` int(11) NOT NULL,
  `headline` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_comment_parent` (`parent_comment`),
  KEY `fk_comment_user` (`user`)
);

ALTER TABLE `comment`
  ADD CONSTRAINT `fk_comment_parent` FOREIGN KEY (`parent_comment`) REFERENCES `comment` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `fk_comment_user` FOREIGN KEY (`user`) REFERENCES `user` (`id`) ON UPDATE CASCADE;

答案 4 :(得分:0)

只有3个表格,conceptsideascomments,其字段引用相关的“父级”。使用正确的索引意味着它们会一样快,或者实际上是由于内存缓存表,打开文件描述符,交叉概念 - 查询等,更快然后任何多表设置。经验法则:如果表 name 中有数据/信息,则表示非常错误。

答案 5 :(得分:0)

您正在寻找“外键引用”。您可能会发现自己有三个表:问题,答案和答案评论。 Answers将有一个字段引用它正在响应的问题的id,同样你会在comments表中有一个字段引用它所响应的答案的id。我希望这些链接可以提供帮助:

Wikipedia

w3c

这是数据库设计的一个重要领域,需要比你期望的更重的读数。