在为数据库(例如MySQL)设计模式时,会出现是否完全规范化表格的问题.
一方面连接(和外键约束等)非常慢,另一方面,您获得冗余数据和不一致的可能性.
这里的"优化最后"是正确的方法吗?即创建一个由书本标准化的数据库,然后查看可以非规范化的内容以实现最佳速度增益.
对于这种方法,我担心的是,我将采用可能不够快的数据库设计 - 但在那个阶段重构模式(同时支持现有数据)将非常痛苦.这就是为什么我很想暂时忘记我所学到的关于"正确"RDBMS实践的一切,并尝试一次"平台"方法.
这个数据库是否会插入重量会影响决定吗?
我们假设如下:
表A.
id | value
----------
1 | red
2 | orange
5 | yellow
10 | green
11 | blue
12 | indigo
20 | violet
Run Code Online (Sandbox Code Playgroud)
我有一个id(10,11,12,13,14)列表,可用于在此表中查找id.这个id列表是在我的前端生成的.
使用纯SQL,我需要从表A中没有条目的列表(10,11,12,13,14)中选择id(加入'id'列).结果应该是id 13和14的结果集.
如何仅使用SQL来实现此目的?(另外,如果可能的话,我想避免使用存储过程)
我能想到的唯一方法是动态创建内联SQL表以暂时保存我的id列表.但是,我不知道该怎么做.这可能吗?有没有更好的办法?
谢谢!:)
我一直在使用python和RDBMS'(MySQL和PostgreSQL),我注意到我真的不明白如何使用游标.
通常,他的脚本通过客户端DB-API(如psycopg2或MySQLdb)连接到数据库:
connection = psycopg2.connect(host='otherhost', etc)
Run Code Online (Sandbox Code Playgroud)
然后创建一个游标:
cursor = connection.cursor()
Run Code Online (Sandbox Code Playgroud)
然后可以发出查询和命令:
cursor.execute("SELECT * FROM etc")
Run Code Online (Sandbox Code Playgroud)
现在查询的结果在哪里,我想知道?它在服务器上?还是我的客户端上的一点点,我的服务器上的一点点?然后,如果我们需要访问某些结果,我们会获取它们:
rows = cursor.fetchone()
Run Code Online (Sandbox Code Playgroud)
要么
rows = cursor.fetchmany()
Run Code Online (Sandbox Code Playgroud)
现在让我们说,我不检索所有行,并决定执行另一个查询,以前的结果会发生什么?是他们的开销.
此外,我应该为每种形式的命令创建一个游标,并以某种方式不断地将它重用于那些相同的命令; 我头psycopg2可以某种方式优化多次执行但具有不同值的命令,它是如何值得的?
谢谢
所以我最近在我的数据库课程中学到了ASSERTION,而我的教授指出主要数据库不支持它,即使它是在SQL-92标准中.我试图谷歌搜索找出原因,但似乎没有任何关于该主题的讨论.
那么,为什么绝大多数关系数据库包都不支持ASSERTION呢?它是一个性能问题还是存在一些本质上难以解决的问题?
如果可以的话,请注意任何实现它的数据库包(例如:如果有学术/教学数据库).另外,为什么关于这个问题的讨论很少; 它甚至没有在维基百科页面中提到SQL或SQL-92)但是首先回答主要问题,或者在评论中回答.
我不是在寻找如何使用触发器或其他任何东西来实现它.
我在技术博客中阅读了以下文本,讨论了NoSQL的优缺点
" 多年来,为了提高数据库服务器的性能,数据库管理员不得不在数据库负载增加(扩展)时购买更大的服务器,而不是随着负载的增加(扩展)将数据库分布在多个"主机"上.RDBMS通常不会轻易扩展,但较新的NoSQL数据库实际上旨在轻松扩展以利用新节点,并且通常在设计时考虑到低成本的商用硬件."
我对RDBMS和NoSQL的可扩展性感到困惑.
我的困惑是:
我将使用MongoDB创建一个学生管理系统.我将为学生提供一张桌子,为出勤记录提供另一张桌子.我可以在考勤表中找到一张钥匙到达学生桌,如下图所示吗?怎么样?

与子查询一起使用时,为什么"IN"运算符这么慢?
select *
from view1
where id in (1,2,3,4,5,6,7,8,9,10)
order by somedata;
Run Code Online (Sandbox Code Playgroud)
在9ms内执行.
select *
from view1
where id in (select ext_id
from aggregate_table
order by somedata limit 10)
order by somedata;
Run Code Online (Sandbox Code Playgroud)
在25000ms内执行并且似乎在view(view1)上使用顺序扫描,而不是像在第一个查询中那样在子查询返回的主键上使用索引扫描.
子查询select ext_id from aggregate_table order by somedata limit 10在0.1ms内执行
所以第二个查询的缓慢是由顺序扫描引起的,在view1该扫描中,每个UNION中包含三个UNIONS和大约三个JOINS的视图.第一个UNION包含大约1M行,其他更少.连接有大约100K行的表.但这并不是那么相关,我只想了解IN运算符的行为.
我想要完成的是获取子查询(一组主键)的结果,并view1使用它们从复杂视图()中选择数据.
我也不能用
select v1.*
from view1 v1,
aggregate_table at
where v1.id = at.ext_id
order by at.somedata
limit 10
Run Code Online (Sandbox Code Playgroud)
因为我不想对大联盟进行排序somedata.我只想从主键视图中选择10个结果,然后只对它们进行排序.
问题是为什么当我明确列出这些键时IN运算符执行速度很快,而当我使用返回完全相同的键集的快速子查询时速度很慢?
根据要求解析分析
第一个查询 - select * from view1 …
给定含n元语法的一列VARCHAR与utf8mb4_unicode_ci归类:
+---------------------------+
| ngram |
+---------------------------+
| stack overflow |
| stack |
| overflow |
| stack overflow protection |
| overflow protection |
| protection |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)
一个查询:
SELECT * FROM ngrams WHERE ngram IN ('stack', 'stack overflow', 'protection', 'overflow')
Run Code Online (Sandbox Code Playgroud)
给定此查询返回的行,如何仅保留返回行中具有最长ngram 的行?
在这个例子中,我得到3行:stack,stack overflow,和protection.
然后,我需要像这样过滤行:
stack,因为stack overflow存在于返回的行中stack overflow,因为没有其他返回的行是包含的ngram stack overflow(stack overflow protection在表中有,但它不在返回的行中)protection太 …我想知道这是不是一个好设计.我有许多需要地址信息的表格(例如街道,邮政编码/邮编,国家,传真,电子邮件).有时相同的地址将重复多次.例如,可以针对供应商存储地址,然后针对发送给他们的每个采购订单存储地址.然后,供应商可以更改其地址,并且任何后续采购订单都应具有新地址.它比这更复杂,但这是一个示例要求.
选项1将所有地址列作为属性放在各个表上.在创建时将详细信息从供应商复制到PO.可能存储多个副本
选项2创建单独的地址表.从供应商和采购订单表到地址表有一个外键.只允许在地址表上插入和删除,因为更新可能会比您想要的更改.然后我会有一些计划任务,删除地址表中不再被任何东西引用的任何行,因此未留下未使用的行.也许对地址表中的所有非pk列也有一个唯一的约束来阻止重复.
我倾向于选择2.有更好的方法吗?
编辑:我必须保留采购订单上的地址,就像发送时一样.此外,我建议它有点复杂,因为可能有一个传递地址和一个帐单地址(还有一堆其他表有地址信息).
过了一会儿,我会根据日期删除旧的采购订单.在此之后,我打算垃圾收集任何地址记录,这些记录不再被任何引用(否则感觉就像我在创建泄漏).
rdbms ×10
sql ×4
mysql ×3
database ×2
performance ×2
cursors ×1
mongodb ×1
nosql ×1
optimization ×1
postgresql ×1
psycopg2 ×1
python ×1
scalability ×1