标签: database-design

子查询与连接

我重构了一个从另一家公司继承的应用程序的缓慢部分,以使用内部连接而不是子查询

WHERE id IN (SELECT id FROM ...)
Run Code Online (Sandbox Code Playgroud)

重构的查询运行速度提高了约100倍.(约50秒到约0.3)我预计会有所改善,但任何人都可以解释为什么它如此激烈?where子句中使用的列都已编入索引.SQL是否每行执行一次where子句中的查询?

更新 - 解释结果:

不同之处在于"where in in()"查询的第二部分 -

2   DEPENDENT SUBQUERY  submission_tags ref st_tag_id   st_tag_id   4   const   2966    Using where
Run Code Online (Sandbox Code Playgroud)

vs 1带连接的索引行:

    SIMPLE  s   eq_ref  PRIMARY PRIMARY 4   newsladder_production.st.submission_id  1   Using index
Run Code Online (Sandbox Code Playgroud)

mysql sql performance database-design join

157
推荐指数
9
解决办法
6万
查看次数

有没有时间使用数据库1:1的关系是有道理的?

我前几天正在考虑规范化,而且我想到了,我想不出一个数据库中应该有1:1关系的时间.

名称:SSN?我将它们放在同一个表PersonID:AddressID?同样,同桌.

我可以提出一个很多或者很多的例子:很多(有适当的中间表),但从不是1:1.

我错过了一些明显的东西吗

sql database-design one-to-one database-normalization

157
推荐指数
14
解决办法
3万
查看次数

NoSql vs Relational数据库

最近NoSQL获得了极大的欢迎.

NoSQL相对于传统RDBMS有哪些优势?

database rdbms database-design relational-database nosql

156
推荐指数
4
解决办法
11万
查看次数

在MySQL中存储SHA1哈希值

当我想在SHA数据库中存储SHA1哈希的结果时,我遇到了一个简单的问题:

VARCHAR字段应该在多长时间内存储哈希的结果?

mysql hash database-design sha1

155
推荐指数
4
解决办法
11万
查看次数

如何存储历史数据

我和一些同事讨论了存储历史数据的最佳方法.目前,对于某些系统,我使用单独的表来存储历史数据,并保留当前活动记录的原始表.所以,假设我有桌子FOO.在我的系统下,所有活动记录将进入FOO,所有历史记录将进入FOO_Hist.FOO中的许多不同字段可以由用户更新,因此我希望保持对更新的所有内容的准确帐户.除了自动递增的HIST_ID之外,FOO_Hist保存与FOO完全相同的字段.每次更新FOO时,我都会在FOO_Hist中执行一个插入语句,类似于:insert into FOO_HIST select * from FOO where id = @id.

我的同事说这是糟糕的设计,因为出于历史原因我不应该有一个表的精确副本,而应该只是在活动表中插入另一条记录,并带有一个标志,表明它是出于历史目的.

是否有处理历史数据存储的标准?在我看来,我不想把我的所有历史记录都放在同一个表格中,因为它可能超过一百万条记录(我在考虑长期).

你或你的公司如何处理这个问题?

我正在使用MS SQL Server 2008,但我想保持任何DBMS的通用和任意的答案.

database-design

152
推荐指数
4
解决办法
11万
查看次数

SQL ON DELETE CASCADE,删除的方式是什么?

如果我在数据库中有两个关系,如下所示:

CREATE TABLE Courses (
  CourseID int NOT NULL PRIMARY KEY,
  Course VARCHAR(63) NOT NULL UNIQUE,
  Code CHAR(4) NOT NULL UNIQUE
);

CREATE TABLE BookCourses (
  EntryID int NOT NULL PRIMARY KEY,
  BookID int NOT NULL,
  Course CHAR(4) NOT NULL,
  CourseNum CHAR(3) NOT NULL,
  CourseSec CHAR(1) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我建立了两者之间的外键关系,如下所示:

ALTER TABLE BookCourses
ADD FOREIGN KEY (Course)
REFERENCES Courses(Code)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

然后,你可以看到,Course在属性BookCourses关系引用Code属性的Courses关系.

我的问题是当两个关系中的任何一个发生删除时,删除级联的方式是什么?如果我删除Courses关系中的元组,它会删除关系中的所有引用元组BookCourses,还是反过来?

感谢您的时间.

sql database database-design cascade relation

152
推荐指数
2
解决办法
18万
查看次数

树数据结构的数据库结构

在数据库中实现可自定义(意味着具有未知级别的树结构)树数据结构的最佳方法是什么?

在使用带有外键的表之前,我已经完成了这一次.

你能看到其他什么实现,这种实现是否有意义?

sql tree database-design

148
推荐指数
3
解决办法
14万
查看次数

何时/为何在SQL Server中使用级联?

在SQL Server中设置外键时,在什么情况下应该在删除或更新时级联它,背后的原因是什么?

这可能也适用于其他数据库.

我最关注每个场景的具体例子,最好是那些成功使用它们的人.

sql-server rdbms database-design cascade foreign-keys

146
推荐指数
9
解决办法
9万
查看次数

审计日志的数据库设计

每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.

这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:

我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.

我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:

  • 数据库模式的成熟度
  • 如何查询日志
  • 需要重新创建记录的概率
  • 更重要的是:写或读性能
  • 正在记录的值的性质(字符串,数字,blob)
  • 存储空间可用

我知道的方法是:

1.为创建和修改的日期和用户添加列

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 创建日期
  • 修改日期
  • 由...制作
  • modified_by

主要缺点:我们失去了修改的历史.提交后无法回滚.

2.仅插入表格

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 删除(布尔值)
  • 用户

主要缺点:如何保持外键最新?需要巨大的空间

3.为每个表创建单独的历史记录表

历史表示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • VALUE_4
  • 用户
  • 删除(布尔值)
  • 时间戳

主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.

4.为所有表创建合并历史记录表

历史表示例:

  • TABLE_NAME
  • 领域
  • 用户
  • NEW_VALUE
  • 删除(布尔值)
  • 时间戳

主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.

audit logging database-design

143
推荐指数
4
解决办法
8万
查看次数

复合主键中可为空的列有什么问题?

ORACLE不允许在包含主键的任何列中使用NULL值.似乎大多数其他"企业级"系统也是如此.

同时,大多数系统还允许可空列的唯一约束.

为什么唯一约束可以有NULL但主键不能?这有一个基本的逻辑原因,还是更多的技术限制?

database database-design

142
推荐指数
6
解决办法
10万
查看次数