我目前正在努力升级到 SQL Server 2019,以便利用其中可用的图形功能。我们的数据库存储文件及其子文件的记录,图形特征使我们能够快速找到文件在任一方向的所有关系。我们当前的开发环境在 Linux 服务器上使用 SQL Server 2019 Standard (15.0.4023.6)。
我在运行图形查询时注意到一个令人担忧的问题。服务器的“内部”资源池在图形查询后似乎没有释放所有资源。如果不选中,这会填满资源池。在重新启动 SQL Server 进程之前,较大的查询将失败。根据服务器负载,这可能会在短短 1-2 小时内发生。这也会填满 tempdb 并威胁填满存储驱动器。在服务器重新启动之前,tempdb 的文件也不能显着缩小/截断。在配置中,'memory.memorylimitmb'没有设置,所以当资源池开始使用默认80%的系统内存(12.8GB,16GB系统内存)中的大部分时,就会出现这个问题
要在演示数据库中设置表:
CREATE TABLE FileNode (ID BIGINT NOT NULL CONSTRAINT PK_FileNode PRIMARY KEY) AS NODE
GO
CREATE TABLE FileNodeArchiveEdge AS EDGE
GO
CREATE INDEX [IX_FileNodeArchiveEdge_ChildFile] ON [dbo].[FileNodeArchiveEdge] ($from_id)
GO
CREATE INDEX [IX_FileNodeArchiveEdge_ParentFile] ON [dbo].[FileNodeArchiveEdge] ($to_id)
GO
Run Code Online (Sandbox Code Playgroud)
填充演示数据库表:
INSERT INTO [FileNode] (ID) VALUES
(1),(2),(3),(4),(5),
(6),(7),(8),(9),(10),
(11),(12),(13),(14),(15)
-- Convenient intermediate table
DECLARE @bridge TABLE (f BIGINT, t BIGINT)
INSERT INTO @bridge (f, t) …
Run Code Online (Sandbox Code Playgroud) 我正在考虑使用图形数据库管理系统(简称 DBMS)作为我的单用户桌面应用程序的应用程序文件格式。
是否有基于单文件的图形 DBMS(图形 DBMS的 SQLite 的“等价物”)?
目标:用户提交他们的通讯录,然后应用程序根据他们的电话号码查找用户之间的联系。类似于“6次握手”的想法(https://en.wikipedia.org/wiki/Six_degrees_of_separation)。
问题:使这个查询性能接近实时。当用户提交他的电话号码并获得其他电话的完整列表时,他可能知道。普通列表 - 没有连接(图形顶点等),但完整,没有分页(这里要求是因为原始目标更复杂)。
问题:是否有可能使用纯关系数据库实现接近实时的性能,而无需图形数据库(Neo4j 等)、图形扩展(bitnine agensgraph)或工作流重新设计?任何非规范化都是可能的,但据我所知,它无济于事。
鉴于:
test=# select * from connections;
user_phone | friend_phone
------------+--------------
1 | 2
1 | 3
1 | 4
2 | 6
2 | 7
2 | 8
8 | 10
8 | 11
8 | 12
20 | 30
40 | 50
60 | 70
Run Code Online (Sandbox Code Playgroud)
我希望使用电话 === 1 的用户收到以下连接:
friend_phone
--------------
2
3
4
6
7
8
10
11
12
(9 rows)
Run Code Online (Sandbox Code Playgroud)
估计真实世界的连接数真的很困难。但我至少在测试:
我有一些体现有向无环图的关系,其中包括类似于以下内容的模式:
我正在寻找一种有效的方法来遍历此图形数据。下面是计算节点 0 的后代的看似简单任务的示例:
DROP TABLE IF EXISTS #edges;
CREATE TABLE #edges(tail int, head int);
INSERT INTO #edges(tail,head) VALUES
(0,1), (5, 6), (10,11), (15,16),
(0,2), (5, 7), (10,12), (15,17),
(1,2), (6, 7), (11,12), (16,17),
(1,3), (7, 8), (11,13), (17,18),
(2,3), (7, 9), (12,13), (17,19),
(2,4), (8, 9), (12,14), (18,19),
(3,4), (8,10), (13,14),
(3,5), (9,10), (13,15),
(4,5), (9,11), (14,15),
(4,6), (14,16);
WITH descendents(node)
AS(
SELECT 0 as node
UNION ALL
SELECT head as node FROM descendents as prior
JOIN #edges …
Run Code Online (Sandbox Code Playgroud) 我有一种感觉,大多数数据库系统起源于 80 年代,并且刻板地实现了表、ACID 事务和约束。它们的构建考虑到了内存、磁盘和处理能力的稀缺性。
我想知道是否有任何存储系统(不需要通过 SQL 访问)能够处理以下内容:
我知道大多数项目都在某处实现(Apache Cassandra、SPARQL、Netezza、Exadata),但我不知道任何可能实现所有项目的产品。
是否有任何程序、源代码或 API 将采用 MySQL 或 PostgreSQL 模式并吐出 UML 或其他图形可视化?
我想使用 Apache Cassandra 根据属性图模型存储大量图数据。该模型包含以下实体:
顶点和边都有一个唯一的主键,可以是字符串或整数值。
例子:
#A vertex
{node_type:'module',pk: 1,...}
#Another vertex
{node_type:'function',pk: 2,...}
#An edge
{incoming_vertex: 1,outgoing_vertex: 2,label: 'body',data : {}}
Run Code Online (Sandbox Code Playgroud)
我想在图表上执行以下类型的查询:
node_type = 'module'
和...获取所有顶点”)检索顶点列表。此外,我还有以下要求和边界条件:
我对数据模型的最初想法如下:
这是一个合理的数据模型吗?关于如何实现这一点的任何其他建议?
我有一个人有几个 ID。其中一些在 Id1 列中,其中一些在 Id2 中。我想将所有相同的人 ID 收集到一组。
如果 id1=10,则与 id2=20 在同一行。所以这意味着id1=10的人与id2=20是同一个人。
输入和输出示例:
Id1 Id2
--- ---
10 20
10 30
30 30
10 40
50 70
60 50
70 70
Run Code Online (Sandbox Code Playgroud)
NewId OldId
----- -----
1 10
1 20
1 30
1 40
2 50
2 60
2 70
Run Code Online (Sandbox Code Playgroud) 任何基于图形/图形感知的数据库(Neo4j、ArangoDB、OrientDB 或其他)是否具有与关系数据库提供的机制相同的维护引用完整性的机制?
我正在探索各种基于文档的数据库,以找到合适的引擎用于向某个项目添加辅助数据存储。
我发现了基于图的/多模型数据库,它们似乎是一个好主意,但我惊讶地发现它们似乎没有提供与现代关系数据库相同级别的关系/链接/边缘保护。
特别是,我正在讨论将实体/顶点的删除与链接/边的删除相链接。在关系数据库中,我可以有一个外键约束,它将一个表中的记录与另一个表中的记录链接起来,并且可以
如果表 A 中的记录被表 B 中的记录引用,则防止删除该记录(“删除时不执行任何操作”),或者
如果删除表 A 中的引用记录,则删除表 B 中的引用记录。
我希望在图形感知数据库中找到类似的机制。例如,如果“评论”顶点链接到“帖子”顶点(形成多对一关系),则需要解决以下问题/挑战:
当该帖子的评论存在边缘时,防止删除该帖子。这样,评论就永远不会有指向帖子的悬空链接/边缘。解决方案是:根据链接/边缘属性,
阻止删除帖子,直到删除该帖子的评论的所有边缘,或者
删除帖子时删除链接到该帖子的所有评论。
防止删除评论到帖子的边缘而不删除评论本身,以防止评论根本没有到帖子的链接/边缘。
仅当创建边缘以同时将此评论链接到帖子时才允许创建评论。
基于图形的数据库中确实缺乏这样的机制,还是我只是找不到它们?
我知道OrientDB有“链接”数据类型,可能解决了第二个问题和第三个问题(如果链接类型属性被声明为强制且非空,那么在不指定链接目的地的情况下不可能创建记录,稍后不可能通过取消设置属性来中断链接)。
然而,据我记得,可以删除链接类型属性指向的记录,从而产生悬空链接(因此第一个问题没有解决)。
我还知道,在某些数据库中,我可以使用嵌套文档作为多个链接文档的替代方案。然而,这种方法不能很好地扩展(对于链接记录数量可以无限增长的情况)。此外,它也非常有限(当需要多个链接时,例如,指向帖子和用户的链接,它不能用作替代方案;还有其他重要的限制)。
--- 更新 ---
感谢您的评论和到目前为止的帮助。我很抱歉没有进一步说明问题。我已经更新了下面的问题。
- - 更新 - -
目前,我被要求为大量数据开发数据库结构。我正在争论实现图形数据库而不是“普通”关系数据库,并且想知道如果数据不一定包含任何关系有什么缺点?可以像表/表中的行一样使用单独的、未连接的节点吗?
我问这个是因为现在不需要关系,但我正试图在未来证明数据库(预期关系)以扩展数据的能力。如果有任何帮助,我正在 OrientDB/Neo4j 或 mySQL/postgreSQL 之间进行辩论。
一个例子:
假设我们有一个充满股票的数据库。任何人几乎可以在任何时间/天买卖股票(只要市场开放)。现在这个数据库可以是一个普通的关系数据库:Table 1: IDs | Products | Prices | Sizes | Dates
. 但也有可能被组织为关系数据库Node 1: Stock A | Node 2: Stock B
。
如果我只是使用数据库来存储股票信息,在我看来普通的数据库会更好。但这是真的吗?它会不会对我使用关系数据库产生负面影响/使用普通数据库会更好吗?在节点而不是行中组织我的数据是否有缺点?
一张图说明一切:
该数据库将主要用于买卖类似股票的产品,但它们也有其他信息,例如附加到它们的位置。我正在尝试预测功能的实现,例如推荐产品,甚至预测某人要购买的下一个产品。
来自数据库的大多数查询将针对每个产品。
从数据库中提取:每天 100 到 1000 次。
推送到数据库:每天 20.000。
一个额外的问题可能会揭示一个缺点:
从关系到图或从图到关系有多容易。有任何锁定危险吗?
感谢所有的帮助,到目前为止评论都很棒!电阻
I have table with observations of objects moving along edges in a graph, this table has the following form:
PK | TIMESTAMP | object_id | from_id | to_id
Run Code Online (Sandbox Code Playgroud)
where object_id
is the id of some object and from_id
and to_id
are vertices.
Since the movements are observed at a high frequency the tuple
(object_id, from_id, to_id)
Run Code Online (Sandbox Code Playgroud)
is repeated often for different PK
and TIMESTAMPS
. I'm interested in all the separate edge traversals, so if an object with id 1 …
我刚刚了解到那里有“图形数据库”,它们更适合两个应用程序“搜索引擎”,尤其是“gis”。
为了避免讨论关系数据库是否更适合并明确需要什么样的数据库,这里有一些我想使用它的详细信息:
from_pageid INT, to_pageid INT
PRIMARY KEY(from_pageid,to_pageid),INDEX(from_pageid)和INDEX(to_pageid);这将有大约 1'000'000 个条目。当使用图形数据库时,每个节点只有所有“从”和“到”链接,有或没有索引,它们就在那里,而无需查找巨大的索引。好的,现在还有一些专业:
你会向我推荐什么数据库?
graph ×12
mysql ×3
postgresql ×2
sql-server ×2
cassandra ×1
cte ×1
graph-dbms ×1
hierarchy ×1
linux ×1
memory ×1
neo4j ×1
performance ×1
php ×1
recursive ×1
spatial ×1
t-sql ×1