我经常发现自己质疑在创建数据库和关系时是否采取正确的方法来计划未来的可扩展性.
我有以下情况:
我有一张Donor桌子和一张Recipient桌子.这两个表共享公共信息,如first_name,last_name,email_address,date_of_birth,等似乎都,如果你不介意我的面向对象语言,都有一个共同的抽象类型的Person.有可能某个人在某一点上Recipient可能会Donor通过捐赠的方式成为一个,所以重要的是不要在表格之间复制信息.我应该选择继承模式,还是应该只将外键Donor和Recipients添加到Person表中?
最初,我在考虑简单地将属性email_address和街道地址属性直接映射到需要它们的东西,但是可能会出现一个人有多个电子邮件地址或邮寄地址(即:家庭,工作等)的可能性.这意味着我们有一个像这样的模型:
create table person(id int primary key auto increment, ...,
default_email_address);
create table email_address(id int primary key auto increment,
email varchar(255), name varchar(255), is_default bool, person_id int);
Run Code Online (Sandbox Code Playgroud)
这让事情变得有点复杂,你可以想象.该name字段还涉及默认值列表以及允许自定义输入.我不能只是把它变成一个enum字段,因为有可能有人会有很多电子邮件需要添加才能完全不同......(这就是我尖叫出来的那一点"它是否值得信赖它" !?!?"并对项目感到沮丧
我想这真正归结为以下几点:数据规范化在什么时候变得荒谬可笑?我的目标是创建一个非常好的as-forward-compatible-as-possible数据模型,我不会自己创建以后创建.
我只是想确保我正确地思考它
1)完全依赖性是指一个或多个主键确定另一个属性
2)部分依赖性是当其中一个主键确定另一个或多个属性时
3)传递依赖性是当nonkey属性确定另一个属性时
我在想它吗?
因此,我正在查看我的数据库备注和材料,试图让自己了解即将采访的一般概念和术语.然而,我已经陷入了依赖,然而无损连接分解.我已经搜遍了所有并且看到了许多mathy方程式,但我正在寻找一个简单而简单的英语响应或示例.
我从http://www.cs.kent.edu/~jin/DM09Fall/lecture6.ppt找到了一个powerpoint,它说明了一个我无法完全理解的例子.它发布在下面.
R = (A, B, C)F = {A ? B, B ? C)
Can be decomposed in two different ways
R1 = (A, B), R2 = (B, C)
Lossless-join decomposition:
R1 ? R2 = {B} and B ? BC
Dependency preserving
R1 = (A, B), R2 = (A, C)
Lossless-join decomposition:
R1 ? R2 = {A} and A ? AB
Not dependency preserving (cannot check B -> C without computing R1 ? R2)
Run Code Online (Sandbox Code Playgroud)
所以我理解A→B和B→C意味着你们彼此有"参考",而A→B和A→C意味着B和C之间没有参考或联系.
所以,
Lossless-join分解是否意味着整体数据仍然完好无损?在这两种情况下,您仍然可以最终获得两种数据,对吧?如果这是错的,请纠正我!:)
在第二次分解中将连接B设置为C有什么意义,这又如何使它不依赖于保留? …
假设关系R( K, L, M, N, P)和持久的功能依赖关系R是:
- L -> P
- MP -> K
- KM -> P
- LM -> N
Run Code Online (Sandbox Code Playgroud)
假设我们将其分解为3个关系,如下所示:
- R1(K, L, M)
- R2(L, M, N)
- R3(K, M, P)
Run Code Online (Sandbox Code Playgroud)
我们如何判断这种分解是否无损? 我用过这个例子
R1∩R2= {L,M},R2∩R3= {M},R1∩R3= {K,M}我们使用函数依赖,在我看来这不是无损的,但有点混淆.
join relational-algebra lossless database-normalization functional-dependencies
警告:
我在用户和门钥匙之间有两种关系.我想了解:
json nosql database-normalization firebase firebase-realtime-database
可能重复:
数据库规范化究竟做了什么?
有人可以澄清数据规范化吗?有什么不同的水平?什么时候应该"去标准化"?我可以过度正常化吗?我有一张包含数百万条记录的表格,我相信我过度规范了它,但我不确定.
使用符合6NF原则标准化的数据库时,如何存储历史属性数据?
比方说,我们从@PerformanceDBA 获取此示例,但具有以下额外要求:
我们需要存储所有产品的历史数据,我们应该只需输入日期并获取该特定时间产品属性的快照.
更实际的示例:
假设上面示例中的磁盘和CPU是虚拟的,用户可以随意更改磁盘容量.我们如何改变数据库,以便我们可以在过去的任何时间(当然是在创建日期之后)检索给定磁盘的属性,同时保持5NF视图足够快.
我正在考虑的事情
任何帮助表示赞赏!
编辑:我知道时态数据库的概念,但问题是,对于我正在使用的数据库引擎(postgresql),时间扩展尚未完全实现.关于如何在没有时态数据库的情况下实现这一目
database database-design relational-database database-normalization
我想了解BCNF是什么,我有这样的关系:
学生(id,ssn,电子邮件,姓名,姓氏)
哪里
有没有违反BCNF的事情,如果有的话,我怎样才能通过更好的设计克服这种情况?
编辑
我正在尝试编写我的功能依赖,但如果我错了请纠正我.
有三个属性决定了其他属性,所以令人困惑的是ssn和email都存在于方程的左侧和右侧.似乎这种关系不是在bcnf但是一定有什么问题:)
id -> (ssn, email, name, surname)
ssn -> (id, email, name, surname)
email -> (id, ssn, name, surname)
Run Code Online (Sandbox Code Playgroud) 我有一个数据,它是一个整数值矩阵,表示带状分布曲线.我正在针对INSERT性能优化SELECT性能.最多有100个乐队.我主要是通过在一段时间内对频段求和或求平均来查询这些数据.
我的问题是,通过在每个频段有1列的表格中展平这些数据,或者使用表示频段值的单个列,我可以获得更好的性能吗?
扁平化数据
UserId ActivityId DateValue Band1 Band2 Band3....Band100
10001 10002 1/1/2013 1 5 100 200
Run Code Online (Sandbox Code Playgroud)
或标准化
UserId ActivityId DateValue Band BandValue
10001 10002 1/1/2013 1 1
10001 10002 1/1/2013 2 5
10001 10002 1/1/2013 3 100
Run Code Online (Sandbox Code Playgroud)
示例查询
SELECT AVG(Band1), AVG(Band2), AVG(Band3)...AVG(Band100)
FROM ActivityBands
GROUP BY UserId
WHERE DateValue > '1/1/2012' AND DateValue < '1/1/2013'
Run Code Online (Sandbox Code Playgroud) 我在1NF形式的DBMS中读过类似下面的内容.
有一句话如下:
"每列都应该是原子的."
任何人都可以通过一个例子向我解释一下吗?