Python中非二叉树型结构用什么数据库存储比较好?
网上查了几天 发现传统关系型数据库好像在实型非二叉树上都 比较吃力啊 那有没有数据库类型是专门搞这些树型结构的呢 我是想搞足球联赛的数据库
根节点(联赛名)—联赛的球队----球队的球员数据
----比赛数据
---------赔率------A 家赔率
------B 家赔率
大概就是这样 感觉 用关系型数据库会抓狂啊~~~~~
Python中非二叉树型结构用什么数据库存储比较好?
你这个看着不是很复杂呀
基本上还是关系型数据库
用主外键关联表
用个 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 比较合适
数据库没学好的典例
你这个怎么看都不像树形结构吧?
谢谢楼上的 大哥们 茅塞顿开

