我们是一家提供采购解决方案的 SaaS 初创公司。操作事务的数据模型已经创建(关系数据库)。我们还希望向决策者提供对这些交易的分析,但使用临时查询从现有表中获取这些数据的效率很低。商业智能/数据仓库的数据建模有哪些资源?
我希望抓取大量网页 (500,000,000,000) 记录并能够存储链接结构以备日后使用。我计划布置数据库的方式如下:
2张桌子
ID URL - Max Length = 2048 chars
---------- -------------------------------
1 http://www.site1.com/page.php
2 http://www.site2.com/page-abc.php
3 http://www.site3.com/page-1.php
4 http://www.site4.com/page-cd.php
5 http://www.site5.com/page-nice.php
6 http://www.site6.com/page-some.php
7 http://www.site7.com/page-hrmm.php
8 http://www.site8.com/page-stack.php
9 http://www.site9.com/page-ex.php
10 http://www.site10.com/page-dba.php
Run Code Online (Sandbox Code Playgroud)
Page Links
---------- -------------------------------
2 1
3 1
4 1
5 1
6 1
7 1
8 1
8 9
9 1
10 1
Run Code Online (Sandbox Code Playgroud)
基本上,我将能够看到哪些网页链接到每个网站的重复/几级深度。我想绘制一个大型网站网络及其链接模式。
所以我需要知道是否有更好的方法来这样做,也许还有一些关于如何设计数据库结构/系统的建议。我计划从 PostgreSQL 开始,因为我已经使用过它,但是有了这么多的数据,我对任何事情都持开放态度。
我创建了一个名为 Customer 的关系并将其定义为:

我只是想知道它是否在3NF中?
我担心的是地址,因为多个客户可能有相同的地址。
我想,因为地址有重复的值,所以它不在 2NF 中。我该如何解决这个问题?
我应该将姓名作为名字、姓氏和地址作为(国家、城市、...)分开吗?
[背景故事] 我有一个关于我们当前小部件库存的简单数据库。它在五六个表中平均只有十几列,但已经有大量的记录。
有些 Widget 带有大写,有些没有,但实际上我们以前从未跟踪过。现在管理层希望用户能够跟踪每个单独的 Widget 是否带有上限。我们不会做盘点来检查我们当前的库存,但是当我为“到达上限”添加新列时,将没有关于今天之前收到的所有数据的数据。处理此类场景的常用最佳实践方法是什么?
添加字符串列时,“”的含义很明显;没有输入数据。但是我添加了一个布尔值,因此现有记录将默认为一个确实表明某些内容的值:FALSE。
我的第一个想法是让用户门户为这个问题设置一个单选按钮对,而不是一个复选框。在创建新记录时,或者甚至返回带有假假的旧记录时,如果他们单击是或否,则记录该值,再加上另一个布尔值表示该问题实际上是手动回答的。那是; 如果第一个布尔值是 F,但第二个布尔值是 T,则第一个布尔值不是“默认假”。
他们挥手的解决方案是将今天之前的记录显示为“未知”(这已被取消,因为现有记录无法手动获得用户验证的 false 值)。我应该使用 faux-bool int 并在三进制中考虑它吗?或者,回到使用单独的跟踪位/布尔值,我应该为这种数据创建一个新表吗?这是一个普遍的概念吗?有什么命名约定吗?
我需要写一个数据仓库图。我的工作人员区域有问题。我必须存储有关工人详细信息(如姓名、年龄等)以及工人工作时间和协议详细信息(如 job_start、job_end、薪水等)的信息。
首先,我试图为每个数据绘制一个维度,但我考虑是否应该像这些维度之间的联系那样做?
我正在尝试为设备建模电缆映射。每个设备都有多个卡,每个卡都有多个端口。由于卡和端口的数量各不相同,我对如何建立正确的规范化形式和关系感到困惑,以解决具有任意数量卡的设备记录和具有任意数量端口的卡。有什么想法吗?
有时我的存储过程看起来像
create procedure handle_data
@fk int,
@value varchar(10)
as
begin
if exists (select * from my_table where id = @fk)
begin
update my_table
set value = @value
where id = @fk
end
else
begin
insert into my_table (fk, value)
select @fk, @value
end
end
Run Code Online (Sandbox Code Playgroud)
调用此存储过程的应用程序设计可能存在错误。
我应该避免制作执行相同存储过程和方法来插入新数据并更新旧数据的应用程序吗?
有没有更好的方法来以一种方法实现更新或插入数据?
我正在使用 SQL Server 2005 / 2008。
对于布尔用途列,哪个更好:可为空char(0)或tinyint(1).
我知道 bool 是 tinyint(1) 的别名,但在 O'reilly 出版的“高性能 MySQL”一书中说:
“如果您想在单个存储空间中存储真/假值,另一种选择是创建一个可为空的 CHAR(0) 列。该列能够存储值 (NULL) 或零的缺失-length 值(空字符串)。"
哪个更适合大小、性能、索引或...
更新:我发现此链接对这个问题很有用: Innodb Tables 的高效布尔值存储
我正在为一个小项目建立一个数据库。我没有太多经验,所以我不确定,但我觉得我没有正确地接近这个。
我有一个系统,允许用户创建课程,其中包含他们回答的问题部分。我已将课程、部分和问题作为单独的实体分开,但问题表需要来自以下内容的外键:

问题:对于需要来自任何地方的外键的问题表,这种布局是否可以接受?有什么可以改进的吗?
谢谢你的帮助。
有人能解释一下数据库中的配置表和数据表有什么区别吗?以及如何设计或实现配置表?我正在使用 MySQL 并且要求是建立一个学生数据库。我知道数据表将包含与学生相关的字段,我已经为此设计了一个设计。我将实施的操作是
我如何为这种动态需求设计配置表,以便以后可以添加更多选项?
任何形式的帮助表示赞赏。请在投票前告诉我原因。提前致谢。
database-design ×10
datatypes ×2
insert ×1
mysql ×1
optimization ×1
performance ×1
sql-server ×1
t-sql ×1
update ×1