【发布时间】:2014-02-13 23:12:28
【问题描述】:
对此有很多问题,但没有足够明确的答案,尤其是在本例中使用 SQL Server。
我有 3 个表格来表示与之相关的博客文章和标签。我想运行一个查询,它将获取所有帖子和每个帖子标签 - 我需要标签 ID 和名称。结果需要很容易地序列化到我的 C# 类中。我也在尝试使用 Dapper.net,但这不是最重要的部分。
显然很多网站都这样做,我想知道最好的方法以及在现实世界中应该如何完成?我可以获取所有帖子,然后为每个帖子运行多个查询,然后返回每个帖子的标签。但肯定有更好的方法吗?
如果我只是想获得一篇文章,那么我只会写多个选择。一个用于帖子,一个用于标签。但我想要所有的帖子。有没有办法在不复制返回的每个标签行的帖子信息的情况下做到这一点?
例如,如果每个帖子的标签都被序列化为一列并用逗号分隔,那么如何才能同时获得 id 和 name?编码字符串?
SELECT * FROM dbo.Posts
SELECT * FROM dbo.Tags
SELECT * FROM dbo.PostTags
Posts
Id Title Content
===============================
1 First Post First Content
3 Second Second Content
Tags
Id Name
============
1 C#
2 SQL
3 IIS
4 Steam
5 OpenID
PostTags
PostId TagId
=============
1 1
1 2
3 3
3 4
只需使用以下查询连接表:
SELECT p.*, t.Name
FROM dbo.Posts p
LEFT JOIN dbo.PostTags pt ON p.id = pt.PostId
LEFT JOIN dbo.Tags t ON t.id = pt.TagId
通过为与之关联的每个标签重复发布内容来提供大量冗余数据:
Id Title Content Name
======================================
1 First Post First Post C#
1 First Post First Post SQL
3 Second Post Second Content IIS
3 Second Post Second Content Steam
【问题讨论】:
-
这将是一个非常丑陋的 hack,但我之前已经看到它在生产中使用过......您可以将它们组合成一个列然后在 C# 端解析它们吗?例如,标签列可能看起来像:“{{{1|||C#}}}{{{2|||SQL}}}”,等等(格式为 {{{ID|||名称}}}...)
-
好吧,我当时在想,我希望看看关于这类事情的最佳实践是什么——我认为这是很常见的事情,不是吗?我还希望使用 Dapper.net(一个微型 ORM)——我认为它不能开箱即用地处理这类事情。
-
这绝对与最佳实践相去甚远(尤其是当您谈论 .NET 和 OOP 以及 ORM 时),但它有时会在现实世界中使用(就像许多其他非常 hacky事物)由于性能和带宽的考虑。另一种可能更好的方法仍然有些过时但不像上面那样丑陋,是返回多个结果集(不知道 Dapper 是否可以处理)。因此,在第一个结果中,标签列将只有一个以逗号分隔的标签 ID 列表,而第二个结果设置了一个实际的标签列表(以及它们的含义)。
-
标签ID(并且只有ID)的逗号分隔列表,就像我的第二个例子一样,实际上并不是那么糟糕的做法。我给出的第一个示例是,但如果您遇到其他方法的限制,它可能会作为一个非常快速的解决方案。
-
并且只是按照标签 ID 和标签名称在不同集合或列中出现的顺序匹配它们?听起来可能比以某种方式编码字符串更好。但是可能仍然需要自定义序列化代码,我猜这不是太大的问题,但是当我已经开始时,现在停止使用 Dapper 很烦人。我想知道堆栈溢出如何获取显示大量问题的主页的数据以及每个问题的标签。他们显然也使用Dapper?这似乎是一个如此简单的问题,但也许不是?
标签: c# sql .net sql-server dapper