我正在创建一个非常简单的数据库(mysql),基本上有两种类型的数据,总是具有1对1的关系:
活动
赞助商
城市将经常被复制,但是为这样一个简单的数据库模式建立城市表真的很有价值吗?
通过屏幕抓取网站来填充数据库.在这个网站上,城市字段通过从下拉列表中选择来填充,因此不会出现错误类型等,并且可以很容易地将记录与城市表进行匹配.即使我的数据库用户经常按城市搜索,我也不确定会有多大意义.
我希望这不会被认为是一个太愚蠢的问题。我对数据库规范化的概念有点困惑,它似乎表明,如果特定字段/列中有任何类型的可预测或重复数据,那么最好创建一个新表并通过外部 ID 链接,这真的是吗?每种情况都需要吗?
例如,诸如“性别”、“业务类型”(没有严格的功能目的,只是信息)、“称呼”(先生、夫人等)等字段,所有这些都将在整个表格中重复,这似乎有点过头了,对我来说有点麻烦为这些创建一个新表?它还意味着我在检索数据时必须使用更多的 JOIN。
在什么时候有必要对重复数据使用单独的表,或者对所有数据都这样做是最佳实践?
我有一个带有基本postgres数据库的rails应用程序,但我意识到我的一些列是字符串,如果它们是浮点数最好.我正在尝试将纬度和经度的列从varchar转换为浮点.
我在postgres上试过这个帖子Rails - gmaps4rails gem,但我一直收到这个错误,ERROR: invalid input syntax for type double precision: "".我愿意尝试其他任何东西,我已经看到了解决postgres查询的方法,但我不确定如何实现它们.这是一个直截了当的问题; "-73.88537758790638"我想成为-73.88537758790638.我似乎无法找到一个可行的解决方案或我理解如何实现的解决方案.
postgresql activerecord ruby-on-rails database-normalization floating-point-conversion
因此,作为我作业的一部分,我必须证明与两个属性的任何关系都符合 BCNF。
根据我的理解,如果对于一个关系我们有第三范式并且一个非关键属性在功能上决定了关键属性,那么它就违反了 BCNF。
假设我的关系由两个属性 A1,A2 组成
场景1(只有一个函数依赖)
A1 -> A2 (so A1 is the key, and A2 does not FD A1 : so no violation)
Run Code Online (Sandbox Code Playgroud)
同样适用于
A2 -> A1
Run Code Online (Sandbox Code Playgroud)
但如果
A1->A2 and A2->A1
Run Code Online (Sandbox Code Playgroud)
这里的key可以是A1,A2。另一个非关键属性在功能上决定了关键。
我收到的错误是:
错误 1366 (HY000):DECIMAL 值不正确:第 -1 行的列 '' 为 '0'
我正在尝试normalize数据库并确保数据类型正确。将数据从 插入BASE_TABLE到名为 的新表中Inventors。
这是我用来插入的查询。如果我从查询中手动获取一行,select它可以正确插入到 Inventors 表中。
但是,像这样运行查询我立即收到上面的错误。
INSERT INTO
Inventors(ID,Firstname,Middlename,Lastname,Country,Latitude,Longitude)
SELECT DISTINCT
Inventor_ID as ID,
Firstname,
Middlename,
Lastname,
Country,
cast(Latitude as decimal(11,6)) as Latitude,
cast(Longitude as decimal(11,6)) as Longitude
FROM
BASE_TABLE
Run Code Online (Sandbox Code Playgroud)
这是无法在查询中插入的行select:
ID Firstname Middlename Lastname Country Latitude Longitude
04308666-3 RICHARD RICHARD JUNG 0.000000 0.000000
Run Code Online (Sandbox Code Playgroud)
Inventors创建查询:
CREATE TABLE `Inventors` (
`ID` varchar(55) NOT NULL DEFAULT '',
`Firstname` …Run Code Online (Sandbox Code Playgroud) 我读到一篇声明“BCNF 中至少有一个简单候选键的关系 R 也在 4NF 中”
我不认为这总是正确的,但我无法证明这一点。
有人可以帮忙吗?
问题在于,存在的关系是如此之大,以至于在标准化之后它们就像20个主键(复合键),它们实际上是外键。
必须将它们声明为主键,以唯一地标识该关系。它是否正确?
第四范式描述了BCNF中的关系,但也没有包含非平凡的多值依赖关系的关系.
我正在努力理解一个微不足道的多值依赖和一个非平凡的多值依赖是什么和差异.如何识别后者才能执行4NF?
编辑:
我主要需要知道琐碎和非平凡依赖之间的区别是什么?
我有一个数据库表(称为Fields),它有大约35列.其中11个总是包含大约每300.000行的相同常量值 - 并充当元数据.
这个结构的缺点是,当我需要更新这11列值时,我需要去更新所有300.000行.
我可以将所有常用数据移动到不同的表中,并在一个地方只更新一次,而不是300.000个地方.
但是,如果我这样做,当我显示字段时,我需要INNER JOIN's在两个表之间创建,我知道这使得SELECT语句更慢.
我必须说,更新列比读取(显示)数据更少发生.
您如何建议我应该将数据存储在数据库中以获得最佳性能?
sql-server database-design sql-server-2008 database-normalization
所以我试图围绕整个"规范化"的事情.为了更好地理解它,我想出了一个存储歌曲的案例
假设我有以下数据库:
专辑表:
album_name| genre
album_1| genre_1, genre_2
album_2| genre_1
album_3| genre_2
Run Code Online (Sandbox Code Playgroud)
为了规范化,我想到了以下方法
专辑表:
album_name| genre_id
album_1| 3
album_2| 1
album_3| 2
Run Code Online (Sandbox Code Playgroud)
流派表:
genre_id| genre_1| genre_2
0| false| false
1| true| false
2| false| true
3| true| true
Run Code Online (Sandbox Code Playgroud)
因此,如果弹出一个新类型,我需要做的就是在流派表中创建一个新列,并且genre_id可以分配新的相应列.那么,这将需要填写所有可能的组合,但这只会针对每个引入的新类型发生一次.
另外,我想到的是,这会被认为是"正常化"吗?从我看过的例子中,我还没有看到创建包含原始数据列的表.