在学习 DBMS 作为一门学科之后,我想到了很多问题。规范化就是其中之一。当我了解到它有更多的困惑时,我发现无论我们在规范化过程中做什么,我们也可以通过一般常识来做到。即使在制作项目时,人们也不习惯遵循它。那么真的有必要吗?公司是否遵循它?我问这个问题是因为它可能会消耗更多的时间来规范化数据库。我们可以使用常识直接对其进行规范化,因此我认为没有必要遵循标准规范化程序。如果我错了,请纠正我。
我不确定是否有人问过这个问题。至少我找不到。
我对数据搜索和检索效率方面的主键感到好奇。
这是一个假设的例子......我有一个独特的学生列表StudentID(比如 10 位数字,因为学校永远不会有那么多学生)和StudentName(这也是独一无二的)。
将其用StudentID作主键或为主键创建一个新字段(可能是 6 - 8 位数字或字符和数字的组合。即 ATC1002)会更好吗?
如果我用StudentName作主键,我会看到任何检索性能下降吗?如果有,一般大概多少钱?是否还有其他因素会影响主要领域的选择?
如果在应用程序中,如果我们在我的应用程序中执行 sql_mode=mysql4.0 作为第一个查询,但在我的应用程序中使用 MySQL 5.1 那么会发生什么?
标题基本上是这样说的:是否有任何不处理列名引用/转义的主要数据库?
例如,假设我想要一个名为的列FROM(假设我有一个非常好的理由)。在每个基于 SQL 的 RDBMS 中,这自然是一个关键字。在 MS SQL Server 中,我可以使用[和转义它]:
CREATE TABLE FOO (
[FROM] VARCHAR(255)
)
Run Code Online (Sandbox Code Playgroud)
MySQL 使用反引号
CREATE TABLE FOO (
`FROM` VARCHAR(255)
)
Run Code Online (Sandbox Code Playgroud)
同样,Oracle 和 Postegres 使用双引号。
是否有任何主要的 RDBMS不支持引用/转义列名,以一种或另一种方式?
假设我有一个 BankAccount 表和一个 BankAccountHistoryTransactions 表。
当涉及到 RDBMS 数据库模式设计时,大多数数据库设计人员会推荐以下内容:
BankAccount Table
int: BankAccountNumber Primary key
double: CashBalance
......
..
Run Code Online (Sandbox Code Playgroud)
此外,在 RDBMS 数据库设计中,BankAccountHistoryTransactions 表将类似于:
BankAccountHistoryTransactions Table
int: BankAccountHistoryTransactionsId Primary key
int: FK_BankAccountNumber Foreign key
DateTime2: DateOfTransaction
.................
.........
Run Code Online (Sandbox Code Playgroud)
在 NoSQL MongoDB 数据库模式中,它更像是一个包含嵌入式 BankAccountHistoryTransactions 集合的 BankAccount 集合:
db.BankAccount.find().pretty()
{
"_id" : ObjectId("51f7be1cd6189a56c399d3bf"),
"BankAccountNumber" : "7575785885859",
"CashBalance" : "890399",
....................................,
...............................,
.......................,
"BankAccountHistoryTransactions" : {
"_id" : ObjectId("51f7be1cd6189a56c399d3bf"),
"BankAccountHistoryTransactionsId": 1,
"DateOfTransaction" : ISODate("2019-12-31T23:00:00Z")
}
}
Run Code Online (Sandbox Code Playgroud)
我对 NoSQL MongoDB 数据库架构设计方法的问题是银行账户可能有大量的 BankAccountHistoryTransactions 条目(可能进入银行账户的数十万个 BankAccountHistoryTransactions 条目)。
因此,如果我们使用如下所示的伪外键关系会不会更好: …
我正在寻找一个好的客户端工具来替换“Oracle SQL Developer”(我目前使用的工具),它支持:
你知道一个吗,最好是免费的?
我意识到这可能是主观上的一团糟,但我希望获得有关该主题的一些客观信息。我也不想去购物,我只想知道“要买什么”。
我对数据库管理很陌生。就像我 4 周前开始使用 SQL,上周使用 MS Access 一样。我即将结束使用 MS Access 的永久数据库项目,其中我遇到了许多 Access 的限制,我已经提到我们需要一些不同的东西。
下一次,我希望能够完全访问“数据库功能”,例如联合对应、相交等。如果需要,我还希望能够通过光标浏览行并能够逐行运行检查。
很可能我们会有一些表,但在最大的表中有几十万个条目。我还需要能够报告数据。我还需要能够从 Agresso 导入。
一个确实引起了我的注意,那就是JPQL,事实上我可以想象维基百科上的例子符合我的需求,而且我能够用 Java 编码。但是我不知道它是否适合我的其余需求,或者如果项目可以轻松转移,是否将项目移交给不精通Java的人。GUI 是必不可少的。
直到上周我才见过甚至听说过 RDBMS,我有点迷茫,现在我需要决定什么最能发挥作用。
什么 RDBMS 最适合我的需求?我怎么知道该选什么?
我对乐观锁的理解是,它使用表中每条记录的时间戳来确定记录的“版本”,这样当记录被多个进程同时访问时,每个记录的版本都有一个引用.
然后,当执行更新时,更新时间戳。在提交更新之前,它会第二次读取记录上的时间戳。如果它拥有的时间戳(版本)不再是记录上的时间戳(因为它自第一次读取以来已被更新),则该过程必须重新读取整个记录并将更新应用于它的新版本。
因此,如果我所说的任何内容不正确,请首先为我澄清。但是,假设我在这里或多或少是正确的......
这实际上如何在 RDBMS 中体现出来?这是在应用程序逻辑(SQL 本身)中强制执行的第二次读取/验证还是 DBA 制定的调整参数/配置?
我想我想知道读取时间戳并在时间戳陈旧时执行第二次更新的逻辑来自哪里。所以我问:是应用程序开发人员强制执行乐观锁,还是由 DBA 强制执行?无论哪种方式,如何?提前致谢!
根据我们组织的一些数据库管理员的说法,通常不建议在我们的 MySQL 数据库中实际强制执行外键关系。相反,最好用伪外键 ID 列简单地表示它,并为外键强制执行额外的应用程序处理。原因是随着数据库的扩展,插入和删除(尤其是级联的)变得非常昂贵。
但这不是违背了 RBDMS 的初衷吗?据我了解,似乎使用 RBDMS 开始的最大原因之一(除了强制 ACID 属性)是确保最小化涉及相关(即通过 FK 由连接表绑定)对象的应用程序查询处理。
那么使用伪外键和附加应用程序处理通常更实用吗?而且,如果是这样,您为什么还要使用 RBDMS?我认为原因是应用程序处理仍然比 NoSQL 解决方案略少(而且更直接)?
阅读这个答案
关系数据库基于关系模型,这是一种在表中表示数据的直观、直接的方式。在关系数据库中,表中的每一行都是一条记录,具有唯一的 ID,称为键。表的列保存数据的属性,每条记录通常每个属性都有一个值,便于建立数据点之间的关系。
卡桑德拉有桌子。
CREATE TABLE movies (
movie_id UUID,
title TEXT,
release_year INT,
PRIMARY KEY (( movie_id ))
);
Run Code Online (Sandbox Code Playgroud)
关系数据与支持 ACID 属性无关。
关系数据与规范化数据无关
为什么 Cassandra 不被认为是关系型数据库?
为什么 Cassandra 被认为是 NoSQL 数据库?尽管它有桌子
rdbms ×10
nosql ×2
cassandra ×1
foreign-key ×1
index ×1
locking ×1
mongodb ×1
mysql ×1
mysql-5.1 ×1
oracle ×1
oracle-10g ×1
oracle-11g ×1
primary-key ×1
schema ×1
update ×1