LMD Asked: 2018-09-23 01:21:04 +0800 CST2018-09-23 01:21:04 +0800 CST 2018-09-23 01:21:04 +0800 CST 在 SQL 中表示列表 772 我的数据库设置是现代 (My)SQL。我有一个内容表,包括 ID。现在,用户应该能够对内容发表评论。为此,我想到了数组。现在我看到代表他们的几种选择: 带有内容 ID 和评论的第二个表评论 每个内容一个新表,用于存储评论(优点:无需为每个评论再次存储内容 ID) 文本/字符串列,使用特定分隔符分隔评论和评论信息 同上,但使用 BLOB 我应该使用哪一个?还有哪些我没有想到的选择?感谢您抽空回答! mysql table 4 个回答 Voted Best Answer Kondybas 2018-09-23T03:17:24+08:002018-09-23T03:17:24+08:00 就关系数据库而言,每个表代表一种类型。表Content包含content类型的项目。表Comment包含comment类型等的项目。没有像“规范化”这样的严格要求将所有相同类型的项目保留在同一个表中。甚至更多 - 有时您必须为了性能而这样做。但是拥有多个相同类型的表需要同时修改所有这些表。根据经验,该要求很容易被错误地违反。现在我正试图不惜一切代价避免这种情况。 当然,如果您必须"the latest comment for [some|all] content"经常获取与结构相同Comment但具有 UNIQUE 约束INSERT .. ON DUPLICATE KEY UPDATE ..(通常缩写为 IODKU)的表,它比任何连接的子查询都要快得多。但这是特例。 所以在我看来,第一种选择比第二种选择要好得多。 第三和第四个选项需要在关系数据库上使用一些冗余的自制存储引擎,这些引擎应该解析字符串或 blob 以获取数据。这种方法不仅损害了性能,而且损害了存储的可靠性和可维护性。这是应该避免的糟糕设计。 Kapil Bhagchandani 2018-09-23T03:00:25+08:002018-09-23T03:00:25+08:00 第二个评论表是最好的选择,因为您可以在不同的时间间隔有不同用户的许多评论,这需要在显示期间分页输出。 每个内容的单独表不仅从数据库方面来说是个坏主意,而且从前端本身如何唯一地标识每个内容也是个坏主意,因此必须需要某种形式的 ID。 将评论数据存储在列中太糟糕了。您最终将拥有不同大小的表格行,而且您需要在应用程序本身内对评论执行所有操作。这将导致您的应用程序性能不佳。 Rick James 2018-10-10T16:00:50+08:002018-10-10T16:00:50+08:00 我投票赞成 2 个表,但可能不会以您建议的任何方式投票。 线程。有一个线程表 - 每个线程一行,包含有关线程的元数据,但没有文本。 问答。每个线程的每个项目都有第二个表。如果它是一个线程中的简单列表,那么这是唯一的其他主表。 评论。如果你有一个复杂的情况,比如这个 stackexchange 论坛,你可能需要第三个表。 请注意问题和答案在结构上非常相似,因此都在第二个表中。但是评论有不同的风格,一组不同的可以做的事情等等。所以他们真的需要第三张表。 我看到有些人试图将 折叠Threads到Q&A桌子上。这会造成混乱,应该避免。 至于一维与树状,都可以用 2 表或 3 表来处理。任何树状表中 都有一个id和一个。对于树的“头”(“根”)为 0。它指向一个否则。(显示输出是 UI 挑战,而不是数据库挑战。)parent_idparent_idid 不要将一堆“相同”的东西扔到一个单元格中。使用另一个表,以便它们可以是每行一个。 不要跨多个列展开数组。同上,使用另一个带有行的表。 youcantryreachingme 2018-10-12T18:55:43+08:002018-10-12T18:55:43+08:00 你的第一个选择对我来说似乎是最好的: 带有内容 ID 和评论的第二个表评论 为什么? 让我们看看为什么其他选项不太理想。 你的第二个选择: 每个内容一个新表,用于存储评论(优点:无需为每个评论再次存储内容 ID) 现在,每次您要读取不同内容类型的评论时,您的代码都必须指定不同的表: if ($contentType = 1) then $sqlPart = 'table1'; elseif ($contentType = 2) then $sqlPart = 'table2'; else $sqlPart = 'table3'; $sql = 'select comment from ' + $sqlPart; 这是不可持续的。您的内容表包含数据 - 您的系统可以添加新数据,然后您必须重新编写程序代码以说明新数据(以及为新内容类型创建新的注释表)。 你的第三个选择: 文本/字符串列,使用特定分隔符分隔评论和评论信息 现在你必须做很多处理才能获得评论: $comments = getCommentsFromWideField(); $commentArray = split($comments); 这不仅需要大量工作——而且您如何将评论按时间顺序排序?您必须将评论时间戳封装到您的宽字符串中。您的超超宽列在数据库中的效率也不高。您将如何更新评论 - 提取所有评论,将字符串分解成一个数组,以某种方式找到您要编辑的评论,编辑它,将数组放回字符串中并更新您的大列。不,谢谢。 你的第四个选择: 同上,但使用 BLOB 我的回复也和上面一样。 规范化数据库如此受欢迎有充分的理由——包括效率和易于理解数据之间的关系。有了一个专门的评论表,您将能够在未来轻松扩展您的数据模型,例如,包含关于每个评论记录的新信息:创建时间;发表评论的用户;赞成票;标签;等等 使用两个表:内容和评论。使用您拥有的 ID 加入他们。你未来的自己会感谢你。
就关系数据库而言,每个表代表一种类型。表
Content
包含content
类型的项目。表Comment
包含comment
类型等的项目。没有像“规范化”这样的严格要求将所有相同类型的项目保留在同一个表中。甚至更多 - 有时您必须为了性能而这样做。但是拥有多个相同类型的表需要同时修改所有这些表。根据经验,该要求很容易被错误地违反。现在我正试图不惜一切代价避免这种情况。当然,如果您必须
"the latest comment for [some|all] content"
经常获取与结构相同Comment
但具有 UNIQUE 约束INSERT .. ON DUPLICATE KEY UPDATE ..
(通常缩写为 IODKU)的表,它比任何连接的子查询都要快得多。但这是特例。所以在我看来,第一种选择比第二种选择要好得多。
第三和第四个选项需要在关系数据库上使用一些冗余的自制存储引擎,这些引擎应该解析字符串或 blob 以获取数据。这种方法不仅损害了性能,而且损害了存储的可靠性和可维护性。这是应该避免的糟糕设计。
第二个评论表是最好的选择,因为您可以在不同的时间间隔有不同用户的许多评论,这需要在显示期间分页输出。
每个内容的单独表不仅从数据库方面来说是个坏主意,而且从前端本身如何唯一地标识每个内容也是个坏主意,因此必须需要某种形式的 ID。
将评论数据存储在列中太糟糕了。您最终将拥有不同大小的表格行,而且您需要在应用程序本身内对评论执行所有操作。这将导致您的应用程序性能不佳。
我投票赞成 2 个表,但可能不会以您建议的任何方式投票。
线程。有一个线程表 - 每个线程一行,包含有关线程的元数据,但没有文本。
问答。每个线程的每个项目都有第二个表。如果它是一个线程中的简单列表,那么这是唯一的其他主表。
评论。如果你有一个复杂的情况,比如这个 stackexchange 论坛,你可能需要第三个表。
请注意问题和答案在结构上非常相似,因此都在第二个表中。但是评论有不同的风格,一组不同的可以做的事情等等。所以他们真的需要第三张表。
我看到有些人试图将 折叠
Threads
到Q&A
桌子上。这会造成混乱,应该避免。至于一维与树状,都可以用 2 表或 3 表来处理。任何树状表中 都有一个
id
和一个。对于树的“头”(“根”)为 0。它指向一个否则。(显示输出是 UI 挑战,而不是数据库挑战。)parent_id
parent_id
id
不要将一堆“相同”的东西扔到一个单元格中。使用另一个表,以便它们可以是每行一个。
不要跨多个列展开数组。同上,使用另一个带有行的表。
你的第一个选择对我来说似乎是最好的:
为什么?
让我们看看为什么其他选项不太理想。
你的第二个选择:
现在,每次您要读取不同内容类型的评论时,您的代码都必须指定不同的表:
这是不可持续的。您的内容表包含数据 - 您的系统可以添加新数据,然后您必须重新编写程序代码以说明新数据(以及为新内容类型创建新的注释表)。
你的第三个选择:
现在你必须做很多处理才能获得评论:
这不仅需要大量工作——而且您如何将评论按时间顺序排序?您必须将评论时间戳封装到您的宽字符串中。您的超超宽列在数据库中的效率也不高。您将如何更新评论 - 提取所有评论,将字符串分解成一个数组,以某种方式找到您要编辑的评论,编辑它,将数组放回字符串中并更新您的大列。不,谢谢。
你的第四个选择:
我的回复也和上面一样。
规范化数据库如此受欢迎有充分的理由——包括效率和易于理解数据之间的关系。有了一个专门的评论表,您将能够在未来轻松扩展您的数据模型,例如,包含关于每个评论记录的新信息:创建时间;发表评论的用户;赞成票;标签;等等
使用两个表:内容和评论。使用您拥有的 ID 加入他们。你未来的自己会感谢你。