Questions tagged «sql»

结构化查询语言(SQL)是一种用于在关系数据库管理系统中管理数据的语言。该标签用于一般的SQL编程问题。它不适用于Microsoft SQL Server(为此,请使用sql-server标记),也不能单独引用SQL的特定方言。


14
“从没有做过代码就无法使SQL Server为您做的更好”-这是设计不良的秘诀吗?
我在很多地方都听到过这个想法。或多或少地认识到,一旦尝试仅使用SQL解决问题就超过了一定程度的复杂性,那么您确实应该在代码中进行处理。 这个想法背后的逻辑是,在大多数情况下,数据库引擎在寻找完成任务的最有效方式方面将比在代码中做得更好。尤其是涉及将结果取决于对数据执行的操作之类的事情时。可以说,对于现代引擎而言,有效地JIT'ing +缓存查询的编译版本在表面上是有意义的。 问题是,以这种方式利用数据库引擎是否本质上是不良的设计实践(以及为什么)。当所有逻辑都存在于数据库中并且您只是通过ORM命中它时,这些界限会进一步模糊。


17
始终拥有一个自动增量整数主键是一种好习惯吗?
在我的数据库中,我倾向于养成使用自动递增的整数主键的习惯,该主键带有id我制作的每个表的名称,以便对任何特定的行进行唯一的查找。 这是一个坏主意吗?这样做有什么弊端吗?有时我会拥有多个指标喜欢id, profile_id, subscriptions这里id是唯一的标识符,profile_id链接到国外id一的Profile表等 还是在某些情况下您不想添加这样的字段?

14
是否有任何技术原因导致在编程中默认日期格式为YYYYMMDD而不是其他格式?
有什么工程上的原因为什么会这样?在RDBMS的情况下,我想知道它与性能有关,因为“ YEAR”比“ MONTH”更具体,例如:您只有2000年,而每年都有“ January”,这样可以更轻松,更快捷地按年份过滤/排序某些内容,这就是为什么年份第一的原因。 但是我不知道这真的有道理吗?有什么理由吗?

4
为什么NoSQL数据库比SQL更可伸缩?
最近,我读了很多有关noSQL DBMS的文章。我了解CAP定理,ACID规则,BASE规则和基本理论。但是没有找到关于为什么NoSQL比RDBMS更容易扩展的资源(例如,在需要大量数据库服务器的系统中)吗? 我猜想,保留约束和外键会浪费资源,而在分发DBMS时,它要复杂得多。但是我希望还有更多。 有人可以解释一下noSQL / SQL如何影响可伸缩性吗?
98 sql  nosql  scalability 

10
为什么“从表中选择*”被视为不良做法
昨天我正在与“业余”程序员讨论(我自己是专业程序员)。我们遇到了他的一些工作,他说他总是查询数据库中的所有列(即使在生产服务器上/代码中)。 我试图说服他不要这样做,但是还没有那么成功。在我看来,程序员仅应查询“简洁”,效率和流量方面实际需要的内容。我误会我的观点了吗?
96 database  sql  mysql  bad-code 

9
在关系数据库中使用列表可以吗?
我一直在尝试设计一个与项目概念相适应的数据库,并遇到了一个似乎引起激烈争论的问题。我已经阅读了几篇文章和一些Stack Overflow的答案,指出永远(或几乎永远)无法在字段中存储ID或类似内容的列表-所有数据都应该是相关的,等等。 不过,我遇到的问题是我正在尝试创建任务分配器。人们将创建任务,将其分配给多个人,并将其保存到数据库中。 当然,如果我将这些任务分别保存在“人员”中,则必须有几十个虚拟的“任务ID”列并对其进行微管理,因为可以将0到100个任务分配给一个人。 再一次,如果我将任务保存在“任务”表中,则必须有几十个虚拟的“ PersonID”列并对其进行微管理-与以前一样的问题。 对于这样的问题,是否可以保存采用一种形式或另一种形式的ID列表,或者我只是不考虑另一种可以在不违反原则的情况下实现的方式?

13
在源代码中编写SQL是否被视为反模式?
将SQL硬编码到这样的应用程序中是否被认为是一种反模式: public List<int> getPersonIDs() { List<int> listPersonIDs = new List<int>(); using (SqlConnection connection = new SqlConnection( ConfigurationManager.ConnectionStrings["Connection"].ConnectionString)) using (SqlCommand command = new SqlCommand()) { command.CommandText = "select id from Person"; command.Connection = connection; connection.Open(); SqlDataReader datareader = command.ExecuteReader(); while (datareader.Read()) { listPersonIDs.Add(Convert.ToInt32(datareader["ID"])); } } return listPersonIDs; } 我通常会有一个存储库层等,但是为了简单起见,我在上面的代码中将其排除在外。 我最近收到了一位同事的一些反馈,该同事抱怨SQL是用源代码编写的。我没有机会问为什么,他现在已经离开了两个星期(也许还有更多)。我认为他的意思是: 使用LINQ …
87 c#  sql 

12
SQL:空字串与NULL值
我知道这个话题有点争议,互联网上有很多各种各样的文章/观点。不幸的是,他们中的大多数人都假设该人不知道NULL和空字符串之间的区别是什么。因此,他们通过联接/聚集讲述令人惊讶的结果的故事,并且通常会做一些更高级的SQL课程。这样,他们绝对会遗漏所有要点,因此对我毫无用处。因此,希望这个问题和所有答案将使话题向前发展。 假设我有一个包含个人信息(姓名,出生等)的表,其中的一列是具有varchar类型的电子邮件地址。我们假设由于某些原因,某些人可能不想提供电子邮件地址。将此类数据(不带电子邮件)插入表时,有两个可用的选择:将单元格设置为NULL或将其设置为空字符串('')。让我们假设我知道选择一个解决方案而不是另一个解决方案的所有技术含义,并且可以为任何一种情况创建正确的SQL查询。问题是,即使两个值在技术层面上都不同,但在逻辑层面上却完全相同。看完NULL和”之后,我得出一个结论:我不知道那个人的电子邮件地址。也不管我怎么努力 我无法使用NULL或空字符串发送电子邮件,因此显然大多数SMTP服务器都同意我的逻辑。所以我倾向于在不知道该值的地方使用NULL,并认为空字符串是一件坏事。 经过与同事的激烈讨论,我提出了两个问题: 我是否假设使用空字符串作为未知值会导致数据库对事实“撒谎”,对吗?更准确地说:使用SQL关于什么是价值和什么不是价值的想法,我可能得出结论:我们拥有电子邮件地址,只是发现它不为空。但是后来,当尝试发送电子邮件时,我会得出一个矛盾的结论:不,我们没有电子邮件地址,@!#$数据库一定在撒谎! 是否有逻辑上的情况,其中空字符串”可以很好地承载重要信息(除了值和没有值),而通过其他任何方式(如附加列)进行存储都会很麻烦/效率低下。我见过很多帖子声称有时将空字符串与实数值和NULL一起使用是很好的,但是到目前为止,还没有看到一种合乎逻辑的方案(就SQL / DB设计而言)。 PS有些人会很想回答,这只是个人品味的问题。我不同意 对我来说,这是一个具有重大后果的设计决策。因此,我希望看到一些出于逻辑和/或技术原因而对此表示反对的答案。
72 design  database  sql  strings  null 

6
为什么在SQL查询中的“从”之前选择“选择”?[关闭]
这件事让我在学校很困扰。 五年前,当我学习SQL时,我总是想知道为什么我们首先指定想要的字段,然后再指定它们的来源。 根据我的想法,我们应该写: From Employee e Select e.Name 那么,为什么规范说以下内容? Select e.Name -- Eeeeek, what does e mean? From Employee e -- Ok, now I know what e is 我花了数周的时间来理解SQL,而且我知道很多时间都花在了错误的元素顺序上。 就像用C#编写: string name = employee.Name; var employee = this.GetEmployee(); 因此,我认为它具有历史原因。为什么?
67 sql  history  syntax 

15
同事重命名了我所有的查询[关闭]
我不知道我是否应该很生气或什么。我单手为大型数据库构建了300多个查询,并制定了命名约定,以便以后找到它们。我办公室里没有其他人甚至不知道如何建立查询,但是昨天我来找他们都被重命名了。我现在很难找到事情,并且试图弄清楚该怎么做。 我和负责人交谈,她只是轻描淡写了整个事情。她说她重命名了它们,以便可以更轻松地找到它们。不幸的是,我是唯一一个知道如何构建,编辑和维护它们的人,而她找到它们的唯一原因就是测试查询。新的命名约定根本没有意义,我觉得我们在开发过程中倒退了一步。 我想找出的是: 1)我反应过度了吗? 2)处理此问题的最佳方法是什么?我不愿意向老板提起这件事,但是在昨天与同事交谈之后,我已经可以告诉她感觉自己做错了什么。
63 database  sql  access 

6
这是构建数据库架构的一种荒谬方法,还是我完全缺少了什么?
我已经对关系数据库做了很多工作,并且认为我对良好模式设计的基本概念非常了解。我最近的任务是接管一个由高薪顾问设计数据库的项目。请让我知道我的直觉是否是“ WTF ??!?” -是必要的,还是这个人真是个天才,以至于他超出了我的领域? 有问题的数据库是一个内部应用程序,用于输入员工的请求。仅查看其中的一小部分,您就可以获得有关用户的信息以及有关所提出的请求的信息。我会这样设计: 用户表: UserID (primary Key, indexed, no dupes) FirstName LastName Department 要求表 RequestID (primary Key, indexed, no dupes) <...> various data fields containing request details UserID -- foreign key associated with User table 简单吧? 顾问是这样设计的(带有示例数据): 用户表 UserID FirstName LastName 234 John Doe 516 Jane Doe 123 …
61 database  sql  schema 

14
为什么SQL注入预防机制会演变为使用参数化查询的方向?
在我看来,可以通过以下方式防止SQL注入攻击: 仔细筛选,过滤和编码输入(在插入SQL之前) 使用准备好的语句 /参数化查询 我想每个都有优点和缺点,但是为什么#2脱颖而出,或多或少地被认为是防止注入攻击的实际方法?是更安全,更不容易出错,还是还有其他因素? 据我了解,如果正确使用#1并注意所有警告,它可能与#2一样有效。 消毒,过滤和编码 在清除,过滤和编码的含义上,我感到有些困惑。我要说的是,出于我的目的,以上所有选项都可以考虑作为选项1。在这种情况下,我了解到清理和过滤有可能修改或丢弃输入数据,而编码可以按原样保留数据,但可以对其进行编码适当避免注射攻击。我认为转义数据可以视为对数据进行编码的一种方式。 参数化查询与编码库 有一些答案,其中parameterized queries和的概念encoding libraries可以互换使用。如果我错了,请指正我,但我印象深刻的是它们是不同的。 我的理解是encoding libraries,无论多么出色,他们总是有潜力修改SQL“程序”,因为在发送给RDBMS之前,他们正在对SQL本身进行更改。 Parameterized queries 另一方面,将SQL程序发送到RDBMS,然后优化查询,定义查询执行计划,选择要使用的索引等,然后插入数据,作为RDBMS内部的最后一步本身。 编码库 data -> (encoding library) | v SQL -> (SQL + encoded data) -> RDBMS (execution plan defined) -> execute statement 参数化查询 data | v SQL -> RDBMS (query execution plan defined) -> …

8
对于需要按内容搜索的大型数据集,使用NoSQL数据库是否不切实际?
我已经学习NoSQL数据库已有一个星期了。 我真的了解NoSQL数据库的优势以及它们非常适合的许多用例。 但是人们通常会在撰写文章时就好像NoSQL可以代替关系数据库一样。还有一点我无法理解: NoSQL数据库是(通常)键值存储。 当然,可以将所有内容存储到键值存储中(通过将数据编码为JSON,XML等),但是我看到的问题是,在许多情况下,您需要获取一些与特定条件匹配的数据用例。在NoSQL数据库中,只有一个可以有效搜索的条件-密钥。关系数据库经过优化,可以有效地搜索数据行中的任何值。 因此,NoSQL数据库并不是持久存储需要按其内容搜索的数据的真正选择。还是我误会了什么? 一个例子: 您需要存储网上商店的用户数据。 在关系数据库中,您将每个用户存储为users表中的一行,并带有ID,名称,他的国家等。 在NoSQL数据库中,您将以ID为密钥存储每个用户,并将其所有数据(以JSON等编码)存储为值。 因此,如果您需要从某个特定国家/地区获取所有用户(出于某种原因,营销人员需要了解他们的某些信息),那么在Relational Database中这样做很容易,但是在NoSQL Database中却不是很有效,因为您必须获取每个用户,解析所有数据并进行过滤。 我并不是说这是不可能的,但是它变得更加棘手,如果您要搜索NoSQL条目的数据,我想那不是那么有效。 您可以为每个国家/地区创建一个密钥,以存储该国家/地区中每个用户的密钥,并通过获取存放在该国家/地区的密钥中的所有密钥来获取特定国家/地区的用户。但是我认为这种技术使复杂的数据集变得更加复杂-难以实现且不如查询SQL数据库有效。因此,我认为这不是您在生产中使用的方式。还是? 我不确定我是否会误解或忽略了一些概念或最佳实践来处理此类用例。也许您可以纠正我的陈述并回答我的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.