首先是一些背景故事:
我正在创建一个网站(与我的队友一起),用户必须能够创建“概念”(包括时间戳,创建它的用户,标题,描述,摘要等等)。在所述概念上,人们必须能够发布“想法”(时间戳,创建者的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数据的最佳方式是什么(我的意思是最快)?
答案 0 :(得分:2)
每个概念也会有一个表
表并不是动态元素。当然,他们可以,但是认真。
关系数据库结构具有静态数量的表。
请阅读fundamentals of relational database design
是否在一个表中组合不同的实体,并添加一个字段来区分它们的问题是非常有效的问题。
最后我认为归结为应用程序。它可以严重加速事情,但也会减速。我更喜欢单独的表,因为你保存了一个索引,并且可以更容易地使用格式分片。 UNION声明很便宜。
话说。从固定对象开始,为它们创建表。为“概念”创建一个表,一个用于“ideas”,一个用于“comments”,一个用于“用户”等...
评论获得了一个“想法”的字段,其中包含了它们的想法等等。
答案 1 :(得分:1)
使用数据库关系。您的三个表格为concept
,idea
和comment
。每个概念都有很多想法,每个想法都有很多评论(虽然我发现它更直观,所以说“每个想法都与一个概念有关,每个评论都与一个想法有关”)。
您的表格如下所示:
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)
通常,实现主题/响应/子注释类型结构的方法是使用三个具有外键的表:
答案 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个表格,concepts
,ideas
和comments
,其字段引用相关的“父级”。使用正确的索引意味着它们会一样快,或者实际上是由于内存缓存表,打开文件描述符,交叉概念 - 查询等,更快然后任何多表设置。经验法则:如果表 name 中有数据/信息,则表示非常错误。
答案 5 :(得分:0)