Python中非二叉树型结构用什么数据库存储比较好?

网上查了几天 发现传统关系型数据库好像在实型非二叉树上都 比较吃力啊 那有没有数据库类型是专门搞这些树型结构的呢 我是想搞足球联赛的数据库
根节点(联赛名)—联赛的球队----球队的球员数据
----比赛数据
---------赔率------A 家赔率
------B 家赔率

大概就是这样 感觉 用关系型数据库会抓狂啊~~~~~
Python中非二叉树型结构用什么数据库存储比较好?


11 回复

你这个看着不是很复杂呀
基本上还是关系型数据库
用主外键关联表

用个 ER 工具画一下就更直观一些。

关键看数据量,要是不大,自己设计数据结构,然后直接 pickle 持久好也行啊。


对于Python中非二叉树型结构(比如多叉树、图、有向无环图等)的存储,没有绝对“最好”的数据库,选择取决于你的具体操作需求。

1. 如果你的主要操作是深度遍历、路径查询、子节点管理 推荐:PostgreSQL + ltree扩展 这是最经典、最“像程序员”的选择。ltree专门为树形结构设计,用点分路径(如 'Top.Science.Astronomy')表示节点,查询效率极高。

import psycopg2

conn = psycopg2.connect(database="test")
cur = conn.cursor()

# 启用ltree扩展
cur.execute("CREATE EXTENSION IF NOT EXISTS ltree")

# 创建表
cur.execute("""
    CREATE TABLE tree_nodes (
        id SERIAL PRIMARY KEY,
        path LTREE NOT NULL,
        data TEXT
    )
""")

# 插入节点(Science是Top的子节点,Astronomy是Science的子节点)
cur.execute("INSERT INTO tree_nodes (path, data) VALUES (%s, %s)", 
            ('Top.Science.Astronomy', '天文数据'))

# 查询Astronomy的所有祖先
cur.execute("SELECT * FROM tree_nodes WHERE path @> 'Top.Science.Astronomy'")
print(cur.fetchall())  # 输出Top, Science, Astronomy

# 查询Science的所有后代
cur.execute("SELECT * FROM tree_nodes WHERE path <@ 'Top.Science'")
print(cur.fetchall())  # 输出Science及其所有子节点

2. 如果你的结构是图(Graph)且需要复杂关系分析 推荐:Neo4j 这是专门的图数据库,用“节点-关系-属性”模型,适合社交网络、推荐系统等场景。

from neo4j import GraphDatabase

driver = GraphDatabase.driver("neo4j://localhost:7687")

def add_node(tx, name):
    tx.run("CREATE (n:Node {name: $name})", name=name)

def create_relationship(tx, parent, child):
    tx.run("""
        MATCH (p:Node {name: $parent})
        MATCH (c:Node {name: $child})
        CREATE (p)-[:HAS_CHILD]->(c)
    """, parent=parent, child=child)

with driver.session() as session:
    session.execute_write(add_node, "Root")
    session.execute_write(add_node, "Child1")
    session.execute_write(create_relationship, "Root", "Child1")

3. 如果你需要灵活的模式和快速开发 推荐:MongoDB 文档数据库的嵌套结构天然适合树形数据,一个文档可以包含整个子树。

from pymongo import MongoClient

client = MongoClient()
db = client.tree_db

# 插入一个嵌套结构的树
tree = {
    "name": "Root",
    "children": [
        {
            "name": "Child1",
            "children": [
                {"name": "Grandchild1", "children": []}
            ]
        }
    ]
}
db.trees.insert_one(tree)

# 查询整个树
result = db.trees.find_one({"name": "Root"})

总结建议:按查询模式选库,ltree在传统树操作上最直接高效。

感觉楼主对关系型数据库有点误解。

表 1 联赛表, 其中主键 id 是联赛 id
表 2 球队表, 其中主键 id 是球队 id
表 3 联赛-球队关联表, 其中主键无业务含义, 每一个联赛和球队对应关系这个表有一条记录, 分别用表 1 表 2 的主键 id 关联
表 4 球员表, 其中主键 id 是球员 id
表 5 球队-球员关联表, 类似表 3

比赛数据类似的

这个很典型的关系型数据库应用场景啊

应该是对数据库有误解

如果对性能要求不高的话。。
之前用过一个,Neo4j

先画 ER 图,然后分解成 BCNF 或者 3NF,就可以用关系型数据库实现了。
mongodb 应该也能满足 LZ 需求。

从楼主描述的进度来看,nosql 比较合适

数据库没学好的典例

你这个怎么看都不像树形结构吧?

谢谢楼上的 大哥们 茅塞顿开

回到顶部