SQL问题中包含许多必要行的一张表
Posted
技术标签:
【中文标题】SQL问题中包含许多必要行的一张表【英文标题】:One table with many necessary rows in SQL issue 【发布时间】:2016-08-12 14:38:39 【问题描述】:想象一下一张书桌。一本书的详细信息,至少有 40 项(例如:Name、HeadAuhtor、SecondAuthor、ISBN、DateOfPublish 以及更多愚蠢的列)。
我想在此表中再添加 30 个与我的工作完全相关但与图书表无关的列(例如:LibraryId、VisitedTimes、DownloadedTimes、HaveFiveStars、HaveFourStars、HaveThreeStars、HaveTwoStars、HaveOneStar [计算图书排名]、SoldTimes , LeasedTimes 等等)。
所以,我们总共有 70 个专栏,至少有 500 万本书。 后面的 30 列最终会被填满,但是:
另一件重要的事情是,有些图书馆可能会完全填满所有前 40 列,但有些图书很多的图书馆可能只填满这 40 列中的 10 列。所以在这种情况下,我们至少有 200 万行包含许多 NULL 或 0 列。
我想要速度和性能。 这个问题对我来说非常重要。而且我无法测试这两种方式来自己检查速度和性能,所以不要告诉我自己去检查。
我只需要一个最好的解决方案来解释我应该做什么!
如果我制作一个有 70 列的书桌可以吗?要不然是啥?以 1 对 1 的关系拆分 2 个表中的 70 列?将前 40 列作为 Json 保存在一个字符串字段中(Json 会很快得到吗?)?
一张 70 列的表或两张 40 列和 30 列的 1:1 关系表真的重要吗?
【问题讨论】:
必须是sql吗?这听起来像是每个对象的属性可以变化的 nosql 数据库的完美候选者。 @JanR ,是的,它必须是 sql,因为我可能有其他表不在这种情况下。只是我的书桌一团糟。 70列会不会很痛?我需要保证。 根据经验,拥有这么多列通常很痛苦,我会查看下面的答案并将其拆分为 2 个表。另一种方法是将可选/不常用字段存储为 json 数据类型,blogs.msdn.microsoft.com/jocapc/2015/05/16/… 以获取更多信息。 另外值得注意的是,您可以在 MSSQL 和 MongoDB 或 DocumentDB 之间建立成功的混合模型 @JanR,你是什么意思有很多问题是一种痛苦?在性能方面是痛苦还是在编码方面?因为编码完全没有问题。我担心的是 70 列的性能。并且必须是 SQL 2014。 【参考方案1】:我将创建 2 个表,其中 table1 中的大多数强制性和重要列(可能 10-15 列),其余在 table2 中。
最重要的是,您的某些列是额外的,例如 HaveFiveStars、HaveFourStars、HaveThreeStars、HaveTwoStars、HaveOneStar。因此,这里的 5 列可以像 ViewerRating 这样只有一列。
同样你可以消除其他列
我认为性能会提高。 阅读本文,
Which is more efficient: Multiple mysql tables or one large table?
这个链接中已经提到了大部分原因。此外,这个链接中的讨论与 mySql 无关,而是与非常通用的 RDBMS 相关。 你应该仔细阅读每一行。这里给出的reson非常技术性。没有假设。
您提到将有 500 万行。而且大部分列将为空。我会说不仅您的性能提高了,而且它也很容易维护。
那里有很多好点,有利于多表。
【讨论】:
第一:当你说2张桌子时,你确定每次我想获取或编辑一本书我都应该加入吗?这么多的获取性能不是很糟糕吗?第二:我必须记录我有多少五星级和多少二星级。 仍然没有回答我的问题。该链接说了一些关于何时使用多表的内容,但这些内容与我的情况无关,(甚至在我的想法中也不重要)。告诉我这个:有 2 个表或 3 个表具有 1:1 的关系并加入以获得更好或只是一个具有 70 列的表?给我技术答案而不是假设。谢谢。【参考方案2】:只需添加一个具有 book_id 作为外键的单独表。
由于并非所有书籍都有附加详细信息,因此从书籍表到附加详细信息表的左外连接。
【讨论】:
这个join每次都会重复,因为我不知道用户是否进入了那些列。所以我必须让他们总是在我的搜索引擎中使用它。前 40 列都可以搜索,接下来的 30 列可以在每次有人点击一本书时使用。 是的,每次都会重复加入。 SQL 数据库非常擅长连接,尤其是外键连接。以上是关于SQL问题中包含许多必要行的一张表的主要内容,如果未能解决你的问题,请参考以下文章