我正在尝试通过 Gun 实现一个树形结构,该结构允许表达公司、这些公司的子公司及其产品之间的关系。我所做的结构如下:
- 有一个根节点:这是某些产品(例如传感器)的主要销售者,其所有子节点(深度节点 1)都是其客户;
- 从深度 1 开始有子节点,而不是叶子:这些是根结的客户;他们可以有不同的分支;支行可以有子支行等,支行数量不限;
- 有叶结:这些是包含在一个分支,一个子分支,一个子分支中的产品......
这是我的想法:
- 创建一个
client
集合; - 将客户端节点放入
client
集合中; - 创建一个
branch
集合; - 将分支节点放在
branch
集合中; - 链接
branches
设置为client
设置; - 创建一个
sensor
集合; - 将传感器节点放在
sensor
集合内; - 链接
sensors
设置为branches
设置。
有人这样想:
[clients]
/\
/ \
(MecDoland) (FrankMirros)
| |
[branches] [branches]
/ | \ |
(NY) (CA) (DA) ...
| | |
| [sensors]...
| |
| ...
[sensors]
/|\
......
这是我的实现
const Gun = require('gun')
const gun = new Gun()
// Just a util function
function printError(ack) {
if (ack.err) {
console.log(ack.err)
}
}
// [clients]
const clients = gun.get('clients') // group
// (MecDoland)
const mac = clients.get('MecDoland').put({ data: 12 })
// (FrankMirros)
const pm = clients.get('FrankMirros').put({ data: 13 })
console.log('Adding to "clients" set MecDoland...')
// [clients] -> (MecDoland)
clients.set(mac, printError)
console.log('Adding to "clients" set philip morris...')
// [clients] -> (FrankMirros)
clients.set(pm, printError)
// [branches]
const branches = gun.get('branches') // group
// (MecDolandNY)
const macny = gun.get('MacDonaldNY').put({ data: 1 }, printError)
// (MecDolandCA)
const macca = gun.get('MecDolandCA').put({ data: 2 }, printError)
// [branches] -> (MecDolandNY)
branches.set(macny, printError)
// [branches] -> (MecDolandCA)
branches.set(macca, printError)
// [MecDoland] -> [branches]
mac.set(branches, printError)
//clients.map().once(v => console.log('CLIENT:',v))
//branches.map().once(v => console.log('BRANCH:',v._))
const sensors = gun.get('sensorsMecDolandNY') // group
const temp = gun.get('temperatue').put({ measure: 'celsius', value: 37 })
const press = gun.get('pressure').put({ measure: 'Bar', value: 2 })
sensors.set(temp)
sensors.set(press)
macny.set(sensors)
// Show all clients
gun
.get('clients')
.map()
.once(v => console.log(v))
有两点我无法澄清:
1 - 我不知道我是否很好地使用了 Gun set:我尝试添加一些关系但没有成功;考虑以下说明:
macDoland.get('client').put(rootNode)
frankMirrors.get('client').put(rootNode)
我试图client
为两个客户节点建立关系,但打印rootNode
显示我只与节点rootNode
有关系!与节点的第一个关系消失了,所以我开始使用 Gun 集。我的代码有效(或多或少),但我不知道我是否正确使用 Gun set以及这是否是正确的方法,因为我想在主要供应商、客户、客户分支机构之间建立这种关系和每个分支中的传感器。client
frankMirrors
macDoland
2 - 我想让这种方法更通用和可扩展:现在有客户端、分支和传感器;这可能会在未来发生变化,客户端和传感器之间的级别数量可能会增加。这意味着客户端节点(深度 1)和传感器(最大深度)之间可能存在任意数量的级别:例如,一个非常小的客户端可能没有分支,因此它的客户端节点smallCompany
将直接链接到它的sensors
; 再举一个例子,一个巨大的客户可能有(比如说)五个深度级别,我不想硬编码 Gun 集名称,例如macDolandNySubSubSubSubBranch
.
如何为任意数量的子分支提供可扩展性?