为什么这么多人喜欢列式数据库?据我了解,人们更喜欢列式数据库,因为 CPU 能够可预测地缓存下一个值,因此查询速度更快。
如何在Flutter中创建唯一的id以添加到firebase中的数据库中?
在数据存储方面,我是个新手,想学习一些技巧。
我想知道如何在 RDBMS 和 NoSQL 存储之间做出选择。
让我们举一个数据量相当大(比如 TB)的系统的例子。而且我们还需要强一致性,而且还需要低延迟。
考虑到数据大小,NoSQL 可能比较合适,但出于一致性原因,RDBMS 类型可能看起来不错。但高一致性意味着低延迟。
尽管一些 RDBMS 也提供分片来解决大数据问题,但延迟仍然是一个问题。
我们如何权衡所有这些利弊来做出决定?
此外,来自初学者 POV 的有关此主题的任何资源可能会有很大帮助。
数据
假设我有一个网格,代表房间里的所有人以及他们彼此交谈时的对话。
约翰 | 苏珊 | 布莱恩 | 雷切尔 | |
---|---|---|---|---|
约翰 | 放心 | 工作 | 运动的 | 电影 |
苏珊 | 工作 | 咕哝着 | 旅行 | 音乐 |
布莱恩 | 运动的 | 旅行 | 没有什么 | 食物 |
雷切尔 | 电影 | 音乐 | 食物 | 自嘲 |
数据库
最初我考虑只制作一个常规表格People
和Conversations
桌子Conversations
是一把钥匙,topic
participant1
participant2
困境
参与者的顺序完全无关。一个简单的问题“Rachel 和 Brian 谈论什么”变成了一个需要运行的复杂查询。
因此必须做以下两件事之一:
- 冗余数据添加到数据库中:(Rachel 和 Brian)或(Brian 和 Rachel)
- 查询非冗余数据需要一个极其复杂的查询,因为您不知道 Rachel 是参与者1还是参与者2。
采用上面的 1 会创建一个不可持续的 O(n^2) 数据库模型,而 2 似乎是 DBA 试图查询有意义的数据的噩梦。
问题
如何对这样的数据结构进行建模?SQL 是否是适合这项工作的工具,还是我应该完全研究其他东西?
我使用以下信息创建了概念数据模型和物理数据模型:
概念数据模型:
物理数据模型:
我希望“购买”有很多“门票”。例如,如下所示:
(PurchaseID, TicketID)
( 1 1 )
( 1 1 )
( 1 2 )
( 1 2 )
这可能对应于“一次购买 4 张门票,2 张一种门票和 2 张另一种门票” )
如何才能正确建模?
这是停车场面试问题的一部分,要求候选人设计停车场系统。停车场的设计实体是一个值得讨论的问题。但我被困在我们必须为车辆分配停车位的部分。
假设我们正在使用外部数据存储来实现停车场问题。并且有很多并发请求,请求停车位。最基本的实现是,
为每个停车位创建单独的数据库行,列可用性为真/假。
每当车辆到来时,找到一个可用的插槽(假设插槽 ID X)
使用乐观锁定将 DB 的可用性更新为 false(即,如果 slotid=X 且可用性 =false 则更新)
上述方法在高并发场景中效果不佳,因为可能会为多个车辆分配相同的槽位,并且步骤 3 对于所有这些车辆都会失败,我们必须从步骤 2 再次重试。
为了最佳地处理这个问题,我应该合并步骤 2、3 并将分配卸载到数据库本身。新流程应如下所示
- 为每个停车位创建单独的数据库行,列可用性为真/假。
- 每当车辆到来时,都会触发 SQL 查询来查找行并将可用性更新为 false。并将slotid归还给车辆?
在 SQl DB 中可以这样做吗?是否有其他方法来实现此功能。
我目前正在学习一个关于数据库开发的单元,我正在学习一个关于规范化的模块,我相信这个ERD已经完成了第二种形式的规范化,因为每个表都有一个主键,所有数据都是原子的,并且没有重复的组,并且我不认为存在任何部分关键依赖性。但我是新人,理解还很薄弱。所以我想知道是否有人可以看看并让我知道他们的想法以及可能的任何帮助,我将不胜感激。
编辑:我不确定是否要抓取 PostCodeAndCity 表并将城市数据包含在地址表中,但是我的学习材料建议这样做。
编辑2:由于创建了这个问题的帐户,我没有声誉来支持你的答案,但我只是想感谢所有花时间分享你的知识的人,我真的很感激它,它进一步提供了帮助我的大大!
是否可以设计一个具有经典树结构(无嵌套集)的数据库,强制只有两个级别?
我认为表格应该是:
ID | 标题 | 父 ID |
---|---|---|
1 | 排 | 无效的 |
2 | 孩子 | 1 |
3 | 孙子错误 | 2 |
第三排应该是不可能的。
我可以在没有触发器或没有任何编程语言的情况下得到它吗?
这是我向这个网站提出的第一个问题,如果这是重复的,我很抱歉,我只是没有受过足够的教育,不知道用于搜索这个概念的正确术语,如果这样的概念是一个已知的模式,我会如果答案有一个名字,我将不胜感激。
现在,回答问题。我将使用 postgres 作为示例,但如果需要,请随意显示其他数据库中的示例。
简化的架构:
create table factory (
id serial primary key,
detail text not null
);
create table process (
id serial primary key,
detail text not null
);
create table item (
id serial primary key,
detail text not null
);
为了简洁起见,我将工厂称为 [F],流程称为 [P],项目称为 [I]。
该模式具有以下概念关系:
- 每个进程专属于一个工厂,因此 [P] n -> 1 [F]
- 每个项目都专属于一个工厂,因此 [I] n -> 1 [F]
- 每个项目可以由多个进程制作,因此 [P] n -> 1 [I]
为了表达这种关系,我想出了一个“factory_item_process”表:
create table factory_item_process (
factory_id integer not null references factory(id),
process_id integer not null references process(id),
item_id integer not null references item(id),
constraint pk_factory_item_process primary key (
factory_id, process_id, item_id
),
constraint uq_factory_item_process_process unique (process_id)
);
这解决了[P] n -> 1 [I]
和[P] n -> 1 [F]
,但没有解决 [I] n -> 1 [F]。
我得出的结论是,没有办法用[I] n -> 1 [F]
唯一的键约束来传达,因此我创建了一个简单的函数来检查 [I] 是否已经属于 [F]:
create function in_other_factories(
factory_id integer,
item_id integer
) returns boolean
language sql returns null on null input
return true in (
select
true
from factory_item_process
where factory_id <> $1
and item_id = $2
);
alter table factory_item_process
add constraint chk_factory_item check(not in_other_factories(factory_id, item_id));
请记住,我是一个新手,我想问:factory_item_process
表达这种关系的正确方式是什么?我感觉自己做错了什么,但又不太能理解。
使用用户定义的函数进行检查看起来像是代码味道,但我想不出其他任何东西。我也不确定表格是否正确标准化。
提前致谢
编辑以回应 Mustaccio 答案:我选择为该关系使用另一个表,因为该关系将具有其自身独有的属性。