เชเซเชฎ เชเซ เชฌเชงเชพ. เช เชฎเซ เชเชซเชฒเชพเชเชจ เชเซเชฐเชพเชซเชฟเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชฎเชพเชเซ เชเชคเซเชชเชพเชฆเชจ เชตเชฟเชเชธเชพเชตเซ เชฐเชนเซเชฏเชพ เชเซเช. เช เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เชธเชฎเชเซเชฐ เชชเซเชฐเชฆเซเชถเซเชฎเชพเช เชฎเซเชฒเชพเชเชพเชคเซเชเชจเชพ เชฎเชพเชฐเซเชเซเชจเชพ เชเชเชเชกเชพเชเซเชฏ เชตเชฟเชถเซเชฒเซเชทเชฃ เชธเชพเชฅเซ เชธเชเชฌเชเชงเชฟเชค เชเชพเชฐเซเชฏ เชเซ.
เช เชเชพเชฐเซเชฏเชจเชพ เชญเชพเช เชฐเซเชชเซ, เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเช เชจเซเชเซเชจเชพ เชชเซเชฐเชเชพเชฐเชจเซ เชธเชฟเชธเซเชเชฎ เชชเซเชฐเชถเซเชจเซ เชชเซเชเซ เชถเชเซ เชเซ:
- เชเซเชเชฒเชพ เชฎเซเชฒเชพเชเชพเชคเซเช เชตเชฟเชธเซเชคเชพเชฐ "A" เชฅเซ เชตเชฟเชธเซเชคเชพเชฐ "B" เชธเซเชงเซ เชชเชธเชพเชฐ เชฅเชฏเชพ;
- เชเซเชเชฒเชพ เชฎเซเชฒเชพเชเชพเชคเซเช เชตเชฟเชธเซเชคเชพเชฐ "A" เชฅเซ เชตเชฟเชธเซเชคเชพเชฐ "B" เชฎเชพเช เชตเชฟเชธเซเชคเชพเชฐ "C" เช เชจเซ เชชเชเซ เชตเชฟเชธเซเชคเชพเชฐ "D" เชฆเซเชตเชพเชฐเชพ เชชเชธเชพเชฐ เชฅเชฏเชพ;
- เชเซเชเซเชเชธ เชชเซเชฐเชเชพเชฐเชจเชพ เชฎเซเชฒเชพเชเชพเชคเซเชจเซ เชตเชฟเชธเซเชคเชพเชฐ โAโ เชฅเซ เชตเชฟเชธเซเชคเชพเชฐ โBโ เชธเซเชงเซ เชฎเซเชธเชพเชซเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเซเชเชฒเซ เชธเชฎเชฏ เชฒเชพเชเซเชฏเซ.
เช เชจเซ เชธเชเชเซเชฏเชพเชฌเชเชง เชธเชฎเชพเชจ เชตเชฟเชถเซเชฒเซเชทเชฃเชพเชคเซเชฎเช เชชเซเชฐเชถเซเชจเซ.
เชตเชฟเชธเซเชคเชพเชฐเซเชฎเชพเช เชฎเซเชฒเชพเชเชพเชคเซเชเชจเซ เชนเชฟเชฒเชเชพเชฒ เช เชจเชฟเชฐเซเชฆเซเชถเชฟเชค เชเซเชฐเชพเชซ เชเซ. เชเชจเซเชเชฐเชจเซเช เชตเชพเชเชเซเชฏเชพ เชชเชเซ, เชฎเซเช เชถเซเชงเซเชฏเซเช เชเซ เชเซเชฐเชพเชซ เชกเซเชฌเซเชเชฎเชเชธเชจเซ เชเชชเชฏเซเช เชตเชฟเชถเซเชฒเซเชทเชฃเชพเชคเซเชฎเช เช เชนเซเชตเชพเชฒเซ เชฎเชพเชเซ เชชเชฃ เชฅเชพเชฏ เชเซ. เชฎเชจเซ เชเซเชตเชพเชจเซ เชเชเซเชเชพ เชนเชคเซ เชเซ เชเซเชฐเชพเชซ เชกเซเชฌเซเชเชฎเชเชธ เชเชตเชพ เชชเซเชฐเชถเซเชจเซ เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชธเชพเชฎเชจเซ เชเชฐเชถเซ (เชเซเชเชฒ; เชกเซเชเชฐ; เชเชฐเชพเชฌ เชฐเซเชคเซ).
เชฎเซเช DBMS เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชชเชธเชเชฆ เชเชฐเซเชฏเซเช
- BerkeleyDB เชธเซเชเซเชฐเซเช เชฌเซเชเชเชจเซเชก, Apache Cassandra, Scylla;
- เชเชเชฟเชฒ เชธเซเชเชเชพเชเชเซ เชฒเซเชฏเซเชธเซเชจ, เชเชฒเชพเชธเซเชเชฟเชเชธเชฐเซเช, เชธเซเชฒเชฐเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ.
JanusGraph เชจเชพ เชฒเซเชเชเซ เชฒเชเซ เชเซ เชเซ เชคเซ OLTP เช เชจเซ OLAP เชฌเชเชจเซ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชเซ.
เชฎเซเช BerkeleyDB, Apache Cassandra, Scylla เช เชจเซ ES เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเซเชฏเซเช เชเซ, เช เชจเซ เช เชเชคเซเชชเชพเชฆเชจเซเชจเซ เชเชชเชฏเซเช เช เชฎเชพเชฐเซ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชตเชพเชฐเชเชตเชพเชฐ เชฅเชพเชฏ เชเซ, เชคเซเชฅเซ เชนเซเช เช เชเซเชฐเชพเชซ DBMS เชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชถเชพเชตเชพเชฆเซ เชนเชคเซ. เชฎเชจเซ RocksDB เชชเชฐ BerkeleyDB เชชเชธเชเชฆ เชเชฐเชตเชพเชจเซเช เชตเชฟเชเชฟเชคเซเชฐ เชฒเชพเชเซเชฏเซเช, เชชเชฐเชเชคเซ เชคเซ เชเชฆเชพเช เชตเซเชฏเชตเชนเชพเชฐเชจเซ เชเชตเชถเซเชฏเชเชคเชพเชเชจเซ เชเชพเชฐเชฃเซ เชเซ. เชเซเชเชชเชฃ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชฎเชพเชชเซ เชถเชเชพเชฏ เชคเซเชตเชพ, เชเชคเซเชชเชพเชฆเชจเชจเชพ เชเชชเชฏเซเช เชฎเชพเชเซ, เชเซเชธเชพเชจเซเชกเซเชฐเชพ เช เชฅเชตเชพ เชธเชพเชฏเชฒเชพ เชชเชฐ เชฌเซเชเชเชจเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชธเซเชเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชฎเซเช Neo4j เชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชงเซเช เชจเชฅเซ เชเชพเชฐเชฃ เชเซ เชเซเชฒเชธเซเชเชฐเชฟเชเช เชฎเชพเชเซ เชตเซเชฏเชพเชตเชธเชพเชฏเชฟเช เชธเชเชธเซเชเชฐเชฃเชจเซ เชเชฐเซเชฐ เชเซ, เชเชเชฒเซ เชเซ, เชเชคเซเชชเชพเชฆเชจ เชเซเชฒเซเชฒเซเช เชจเชฅเซ.
เชเซเชฐเชพเชซ เชกเซเชฌเซเชเชฎเชเชธ เชเชนเซ เชเซ: "เชเซ เชคเซ เชเซเชฐเชพเชซ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ, เชคเซ เชคเซเชจเซ เชเซเชฐเชพเชซ เชเซเชตเซ เชเชฃเซ!" - เชธเซเชเชฆเชฐเชคเชพ!
เชชเซเชฐเชฅเชฎ, เชฎเซเช เชเช เชเซเชฐเชพเชซ เชฆเซเชฐเซเชฏเซ, เชเซ เชเซเชฐเชพเชซ เชกเซเชฌเซเชเชฎเชเชธเชจเชพ เชธเชฟเชฆเซเชงเชพเชเชคเซ เช เชจเซเชธเชพเชฐ เชฌเชฐเชพเชฌเชฐ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ:
เชเช เชธเชพเชฐ เชเซ Zone
, เชตเชฟเชธเซเชคเชพเชฐ เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ. เชเซ ZoneStep
เชเชจเซเช เชเซ Zone
, เชชเชเซ เชคเซ เชคเซเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชเซ. เชธเชพเชฐ เชชเชฐ Area
, ZoneTrack
, Person
เชงเซเชฏเชพเชจ เชเชชเชถเซ เชจเชนเซเช, เชคเซเช เชกเซเชฎเซเชจเชจเชพ เชเซ เช
เชจเซ เชชเชฐเซเชเซเชทเชฃเชจเชพ เชญเชพเช เชคเชฐเซเชเซ เชเชฃเชตเชพเชฎเชพเช เชเชตเชคเชพ เชจเชฅเซ. เชเซเชฒ เชฎเชณเซเชจเซ, เชเชตเชพ เชเซเชฐเชพเชซ เชธเซเชเซเชฐเชเซเชเชฐ เชฎเชพเชเซ เชธเชพเชเชเชณ เชถเซเชง เชเซเชตเซเชฐเซ เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชถเซ:
g.V().hasLabel('Zone').has('id',0).in_()
.repeat(__.out()).until(__.out().hasLabel('Zone').has('id',19)).count().next()
เชฐเชถเชฟเชฏเชจ เชญเชพเชทเชพเชฎเชพเช เชเชเชเช เชเชจเชพ เชเซเชตเซเช เชเซ: ID=0 เชธเชพเชฅเซ เชเซเชจ เชถเซเชงเซ, เชฌเชงเชพ เชถเชฟเชฐเซเชฌเชฟเชเชฆเซเช เชฒเซ เชเซ เชเซเชฏเชพเชเชฅเซ เชงเชพเชฐ เชคเซเชจเซ เชคเชฐเชซ เชเชพเชฏ เชเซ (เชเซเชจเชธเซเชเซเชช), เชเซเชฏเชพเช เชธเซเชงเซ เชคเชฎเชจเซ เชคเซ เชเซเชจเชธเซเชเซเชชเซเชธ เชจ เชฎเชณเซ เชเซเชฏเชพเช เชธเซเชงเซ เชคเซ เชเซเชจเชจเซ เชงเชพเชฐ เชนเซเชฏ เชคเซเชฏเชพเช เชธเซเชงเซ เชชเชพเชเชพ เชจ เชเชพเชต เชคเซเชฏเชพเช เชธเซเชงเซ เชฐเซเชเซ. ID=19, เชเชตเซ เชธเชพเชเชเชณเซเชจเซ เชธเชเชเซเชฏเชพ เชเชฃเซ.
เชนเซเช เชเชฒเซเช เชชเชฐ เชถเซเชงเชตเชพเชจเซ เชคเชฎเชพเชฎ เชเชเชฟเชฒเชคเชพเชเชจเซ เชเชพเชฃเชตเชพเชจเซ เชกเซเชณ เชเชฐเชคเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เช เชเซเชตเซเชฐเซ เช เชชเซเชธเซเชคเชเชจเชพ เชเชงเชพเชฐเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ (
เชฎเซเช เชฌเชฐเซเชเชฒเซเชกเซเชฌเซ เชฌเซเชเชเชจเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชพเชจเซเชธเชเซเชฐเชพเชซ เชเซเชฐเชพเชซ เชกเซเชเชพเชฌเซเชเชฎเชพเช 50 เชฅเซ 3 เชชเซเชเชจเซเชเชจเซ เชฒเชเชฌเชพเชเชจเชพ 20 เชนเชเชพเชฐ เชเซเชฐเซเช เชฒเซเชก เชเชฐเซเชฏเชพ, เชเซ เชฎเซเชเชฌ เชเชจเซเชกเซเชเซเชธ เชฌเชจเชพเชตเซเชฏเชพ
เชชเชพเชฏเชฅเซเชจ เชกเชพเชเชจเชฒเซเชก เชธเซเชเซเชฐเชฟเชชเซเช:
from random import random
from time import time
from init import g, graph
if __name__ == '__main__':
points = []
max_zones = 19
zcache = dict()
for i in range(0, max_zones + 1):
zcache[i] = g.addV('Zone').property('id', i).next()
startZ = zcache[0]
endZ = zcache[max_zones]
for i in range(0, 10000):
if not i % 100:
print(i)
start = g.addV('ZoneStep').property('time', int(time())).next()
g.V(start).addE('belongs').to(startZ).iterate()
while True:
pt = g.addV('ZoneStep').property('time', int(time())).next()
end_chain = random()
if end_chain < 0.3:
g.V(pt).addE('belongs').to(endZ).iterate()
g.V(start).addE('goes').to(pt).iterate()
break
else:
zone_id = int(random() * max_zones)
g.V(pt).addE('belongs').to(zcache[zone_id]).iterate()
g.V(start).addE('goes').to(pt).iterate()
start = pt
count = g.V().count().next()
print(count)
เช เชฎเซ SSD เชชเชฐ 4 เชเซเชฐเซ เช เชจเซ 16 GB RAM เชธเชพเชฅเซ VM เชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ เชเซ. JanusGraph เช เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฎเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ:
docker run --name janusgraph -p8182:8182 janusgraph/janusgraph:latest
เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเซเชเซเชเชธ เชฎเซเชณ เชถเซเชง เชฎเชพเชเซ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเชพ เชกเซเชเชพ เช เชจเซ เชเชจเซเชกเซเชเซเชธ เชฌเชฐเซเชเชฒเซเชกเซเชฌเซเชฎเชพเช เชธเชเชเซเชฐเชนเชฟเชค เชฅเชพเชฏ เชเซ. เช เชเชพเช เชเชชเซเชฒเซ เชตเชฟเชจเชเชคเซเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเซเชฏเชพ เชชเชเซ, เชฎเชจเซ เชเชฃเซ เชฆเชธ เชธเซเชเชเชก เชเซเชเชฒเซ เชธเชฎเชฏ เชฎเชณเซเชฏเซ.
เชเชชเชฐเซเชเซเชค 4 เชธเซเชเซเชฐเชฟเชชเซเชเซเชจเซ เชธเชฎเชพเชเชคเชฐเชฎเชพเช เชเชฒเชพเชตเซเชจเซ, เชฎเซเช เชกเซเชเชฐ เชฒเซเชเชฎเชพเช เชเชพเชตเชพ เชธเซเชเซเชเชเซเชฐเซเชธ (เช เชจเซ เชเชชเชฃเซ เชฌเชงเชพ เชเชพเชตเชพ เชธเซเชเซเชเชเซเชฐเซเชธ เชตเชพเชเชเชตเชพเชจเซเช เชชเชธเชเชฆ เชเชฐเซเช เชเซเช) เชจเซ เชเซเชถเชเซเชถเชพเชฒ เชธเซเชเซเชฐเซเชฎ เชธเชพเชฅเซ DBMS เชจเซ เชเซเชณเชพเชฎเชพเช เชซเซเชฐเชตเชตเชพเชฎเชพเช เชธเชซเชณ เชฅเชฏเซ.
เชฅเซเชกเซ เชตเชฟเชเชพเชฐ เชเชฐเซเชฏเชพ เชชเชเซ, เชฎเซเช เชเซเชฐเชพเชซ เชกเชพเชฏเชพเชเซเชฐเชพเชฎเชจเซ เชจเซเชเซเชจเชพ เชฎเชพเชเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช:
เช เชจเชเซเชเซ เชเชฐเชตเซเช เชเซ เชเชจเซเชเชฟเชเซ เชเชเซเชฐเชฟเชฌเซเชฏเซเชเซเชธ เชฆเซเชตเชพเชฐเชพ เชถเซเชงเชตเซเช เช เชงเชพเชฐ เชฆเซเชตเชพเชฐเชพ เชถเซเชงเชตเชพ เชเชฐเชคเชพเช เชตเชงเซ เชเชกเชชเซ เชนเชถเซ. เชชเชฐเชฟเชฃเชพเชฎเซ, เชฎเชพเชฐเซ เชตเชฟเชจเชเชคเซ เชจเซเชเซเชจเชพเชฎเชพเช เชซเซเชฐเชตเชพเช:
g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()
เชฐเชถเชฟเชฏเชจเชฎเชพเช เชเชเชเช เชเชจเชพ เชเซเชตเซเช เชเซ: ID=0 เชธเชพเชฅเซ ZoneStep เชถเซเชงเซ, เชเซเชฏเชพเช เชธเซเชงเซ เชคเชฎเชจเซ ID=19 เชธเชพเชฅเซ ZoneStep เชจ เชฎเชณเซ เชคเซเชฏเชพเช เชธเซเชงเซ เชชเชพเชเชพ เชจ เชเชพเชต, เชเชตเซ เชธเชพเชเชเชณเซเชจเซ เชธเชเชเซเชฏเชพ เชเชฃเซ.
เชฌเชฟเชจเชเชฐเซเชฐเซ เชเซเชกเชพเชฃเซ เชจ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชฎเชพเชฐเซ เชเชพเชคเชจเซ เชตเชฟเชถเซเชทเชคเชพเช เชธเซเชงเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเชพเชเชตเชพ เชฎเชพเชเซ เชฎเซเช เชเชชเชฐ เชเชชเซเชฒ เชฒเซเชกเชฟเชเช เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชชเชฃ เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ.
เชตเชฟเชจเชเชคเซเชจเซ เชชเซเชฐเซเชฃ เชฅเชตเชพเชฎเชพเช เชนเชเซ เชชเชฃ เชเชฃเซ เชธเซเชเชเชก เชฒเชพเชเซ, เชเซ เช เชฎเชพเชฐเชพ เชเชพเชฐเซเชฏ เชฎเชพเชเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เช เชธเซเชตเซเชเชพเชฐเซเชฏ เชนเชคเซ, เชเชพเชฐเชฃ เชเซ เชคเซ เชเซเชเชชเชฃ เชชเซเชฐเชเชพเชฐเชจเซ AdHoc เชตเชฟเชจเชเชคเซเชเชจเชพ เชนเซเชคเซเช เชฎเชพเชเซ เชฌเชฟเชฒเชเซเชฒ เชฏเซเชเซเชฏ เชจ เชนเชคเซ.
เชฎเซเช เชเชพเชจเซเชธเชเซเชฐเชพเชซเชจเซ เชเชชเชฏเซเช Scylla เชจเซ เชธเซเชฅเซ เชเชกเชชเซ Cassandra เช เชฎเชฒเซเชเชฐเชฃ เชคเชฐเซเชเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเชฏเซ, เชชเชฐเชเชคเซ เชเชจเชพเชฅเซ เชชเซเชฐเชญเชพเชตเชฎเชพเช เชเซเช เชจเซเชเชงเชชเชพเชคเซเชฐ เชซเซเชฐเชซเชพเชฐเซ เชฅเชฏเชพ เชจเชฅเซ.
เชคเซเชฅเซ "เชคเซ เชเซเชฐเชพเชซ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ" เช เชนเชเซเชเชค เชนเซเชตเชพ เชเชคเชพเช, เชนเซเช เชเชกเชชเชฅเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชฐเชพเชซ DBMS เชฎเซเชณเชตเซ เชถเชเซเชฏเซ เชจเชฅเซ. เชนเซเช เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชฎเชพเชจเซเช เชเซเช เชเซ เชนเซเช เชเชเชเช เชเชพเชฃเชคเซ เชจเชฅเซ เช เชจเซ เชเซเชจเซเชธเชเซเชฐเชพเชซเชจเซ เชตเชฟเชญเชพเชเชฟเชค เชธเซเชเชจเซเชกเชฎเชพเช เช เชถเซเชง เชเชฐเชตเชพเชจเซเช เชถเชเซเชฏ เชเซ, เชเซ เชเซ, เชนเซเช เชคเซ เชเชฐเซ เชถเชเซเชฏเซ เชจ เชนเชคเซ.
เชธเชฎเชธเซเชฏเชพเชจเซ เชนเชเซ เชนเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชตเชพเชฅเซ, เชฎเซเช เชเซเชเชจ เช เชจเซ เชเซเชทเซเชเชเซเชจเชพ เชชเซเชตเช เชตเชฟเชถเซ เชตเชฟเชเชพเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช, เชเซ เชฒเชพเชตเชฃเซเชฏเชจเซ เชฆเซเชฐเชทเซเชเชฟเช เชเชถเชพเชตเชพเชฆเชจเซ เชชเซเชฐเซเชฐเชฟเชค เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช เชเช เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชตเชฟเชเชฒเซเชช เชฌเชจเซ เชถเชเซ เชเซ.
เช เชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชเซเช เชชเชนเซเชฒเซเชฅเซ เช Apache ClickHouse เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ, เชคเซเชฅเซ เชฎเซเช เช เชตเชฟเชถเซเชฒเซเชทเชฃเชพเชคเซเชฎเช DBMS เชชเชฐ เชฎเชพเชฐเชพ เชธเชเชถเซเชงเชจเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ.
เชเช เชธเชฐเชณ เชฐเซเชธเซเชชเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชฒเชฟเชเชนเชพเชเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ:
sudo docker run -d --name clickhouse_1
--ulimit nofile=262144:262144
-v /opt/clickhouse/log:/var/log/clickhouse-server
-v /opt/clickhouse/data:/var/lib/clickhouse
yandex/clickhouse-server
เชฎเซเช เชคเซเชฎเชพเช เชกเซเชเชพเชฌเซเช เช เชจเซ เชเซเชฌเชฒ เช เชฐเซเชคเซ เชฌเชจเชพเชตเซเชฏเซเช เชเซ:
CREATE TABLE
db.steps (`area` Int64, `when` DateTime64(1, 'Europe/Moscow') DEFAULT now64(), `zone` Int64, `person` Int64)
ENGINE = MergeTree() ORDER BY (area, zone, person) SETTINGS index_granularity = 8192
เชฎเซเช เชคเซเชจเซ เชจเซเชเซเชจเซ เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชกเซเชเชพเชฅเซ เชญเชฐเซ เชฆเซเชงเซเช เชเซ:
from time import time
from clickhouse_driver import Client
from random import random
client = Client('vm-12c2c34c-df68-4a98-b1e5-a4d1cef1acff.domain',
database='db',
password='secret')
max = 20
for r in range(0, 100000):
if r % 1000 == 0:
print("CNT: {}, TS: {}".format(r, time()))
data = [{
'area': 0,
'zone': 0,
'person': r
}]
while True:
if random() < 0.3:
break
data.append({
'area': 0,
'zone': int(random() * (max - 2)) + 1,
'person': r
})
data.append({
'area': 0,
'zone': max - 1,
'person': r
})
client.execute(
'INSERT INTO steps (area, zone, person) VALUES',
data
)
เชเชจเซเชธเชฐเซเชเซเชธ เชฌเซเชเชฎเชพเช เชเชตเชคเชพ เชนเซเชตเชพเชฅเซ, เชญเชฐเชตเชพเชจเซเช เชเชพเชจเซเชธเชเซเชฐเชพเชซ เชเชฐเชคเชพเช เชเชฃเซเช เชเชกเชชเซ เชนเชคเซเช.
JOIN เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฌเซ เชเซเชตเซเชฐเซ เชฌเชจเชพเชตเซ. เชฌเชฟเชเชฆเซ A เชฅเซ เชฌเชฟเชเชฆเซ B เชคเชฐเชซ เชเชตเชพ เชฎเชพเชเซ:
SELECT s1.person AS person,
s1.zone,
s1.when,
s2.zone,
s2.when
FROM
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 0)) AS s1 ANY INNER JOIN
(SELECT *
FROM steps AS s2
WHERE (area = 0)
AND (zone = 19)) AS s2 USING person
WHERE s1.when <= s2.when
3 เชชเซเชเชจเซเชเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชตเชพ เชฎเชพเชเซ:
SELECT s3.person,
s1z,
s1w,
s2z,
s2w,
s3.zone,
s3.when
FROM
(SELECT s1.person AS person,
s1.zone AS s1z,
s1.when AS s1w,
s2.zone AS s2z,
s2.when AS s2w
FROM
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 0)) AS s1 ANY INNER JOIN
(SELECT *
FROM steps AS s2
WHERE (area = 0)
AND (zone = 3)) AS s2 USING person
WHERE s1.when <= s2.when) p ANY INNER JOIN
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 19)) AS s3 USING person
WHERE p.s2w <= s3.when
เชตเชฟเชจเชเชคเซเช, เช เชฒเชฌเชคเซเชค, เชเซเชฌ เชกเชฐเชพเชฎเชฃเซ เชฒเชพเชเซ เชเซ; เชตเชพเชธเซเชคเชตเชฟเช เชเชชเชฏเซเช เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชธเซเชซเซเชเชตเซเชฐ เชเชจเชฐเซเชเชฐ เชนเชพเชฐเซเชจเซเชธ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเซ เชเซ, เชคเซเช เชเชพเชฎ เชเชฐเซ เชเซ เช เชจเซ เชคเซเช เชเชกเชชเชฅเซ เชเชพเชฎ เชเชฐเซ เชเซ. เชชเซเชฐเชฅเชฎ เช เชจเซ เชฌเซเชเซ เชฌเชเชจเซ เชตเชฟเชจเชเชคเซเช 0.1 เชธเซเชเชจเซเชกเชฅเซ เชเชเชพ เชธเชฎเชฏเชฎเชพเช เชชเซเชฐเซเชฃ เชฅเชพเชฏ เชเซ. เช เชนเซเช 3 เชชเซเชเชจเซเชเชฎเชพเชเชฅเซ เชชเชธเชพเชฐ เชฅเชคเชพ เชเชพเชเชจเซเช(*) เชฎเชพเชเซ เชเซเชตเซเชฐเซ เชเชเซเชเซเชเซเชฏเซเชถเชจ เชธเชฎเชฏเชจเซเช เชเชฆเชพเชนเชฐเชฃ เชเซ:
SELECT count(*)
FROM
(
SELECT
s1.person AS person,
s1.zone AS s1z,
s1.when AS s1w,
s2.zone AS s2z,
s2.when AS s2w
FROM
(
SELECT *
FROM steps
WHERE (area = 0) AND (zone = 0)
) AS s1
ANY INNER JOIN
(
SELECT *
FROM steps AS s2
WHERE (area = 0) AND (zone = 3)
) AS s2 USING (person)
WHERE s1.when <= s2.when
) AS p
ANY INNER JOIN
(
SELECT *
FROM steps
WHERE (area = 0) AND (zone = 19)
) AS s3 USING (person)
WHERE p.s2w <= s3.when
โโcount()โโ
โ 11592 โ
โโโโโโโโโโโ
1 rows in set. Elapsed: 0.068 sec. Processed 250.03 thousand rows, 8.00 MB (3.69 million rows/s., 117.98 MB/s.)
IOPS เชตเชฟเชถเซ เชจเซเชเชง. เชกเซเชเชพเชจเซ เชตเชธเซเชคเซ เชเชฐเชคเซ เชตเชเชคเซ, เชเชพเชจเซเชธเชเซเชฐเชพเชซเซ IOPS (เชเชพเชฐ เชกเซเชเชพ เชตเชธเซเชคเซ เชฅเซเชฐเซเชกเซ เชฎเชพเชเซ 1000-1300) เชจเซ เชเชเชฆเชฎ เชเชเชเซ เชธเชเชเซเชฏเชพ เชเชจเชฐเซเช เชเชฐเซ เชนเชคเซ เช เชจเซ IOWAIT เชเซเชฌ เชเชเชเซ เชนเชคเซ. เชคเซ เช เชธเชฎเชฏเซ, เชเซเชฒเชฟเชเชนเชพเชเชธเซ เชกเชฟเชธเซเช เชธเชฌเชธเชฟเชธเซเชเชฎ เชชเชฐ เชจเซเชฏเซเชจเชคเชฎ เชฒเซเชก เชเชจเชฐเซเช เชเชฐเซเชฏเซ.
เชจเชฟเชทเซเชเชฐเซเชท
เช เชฎเซ เช เชชเซเชฐเชเชพเชฐเชจเซ เชตเชฟเชจเชเชคเซเชจเซ เชธเซเชตเชพ เชเชชเชตเชพ เชฎเชพเชเซ เชเซเชฒเชฟเชเชนเชพเชเชธเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ. เช เชฎเซ เชเซเชฒเซเชเชนเชพเชเชธเชฎเชพเช เชฒเซเชก เชเชฐเชคเชพ เชชเชนเซเชฒเชพ เช เชชเชพเชเซ เชซเซเชฒเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชตเซเชจเซเช เชธเซเชเซเชฐเซเชฎเชจเซ เชชเซเชฐเซ-เชชเซเชฐเซเชธเซเชธ เชเชฐเซเชจเซ เชฎเชเชฟเชฐเชฟเชฏเชฒเชพเชเชเซเชก เชตเซเชฏเซเช เช เชจเซ เชชเซเชฐเซเชฒเชฒเชพเชเชเซเชถเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชนเชเชฎเซเชถเชพ เชเซเชตเซเชฐเซเชเชจเซ เชตเชงเซ เชเชชเซเชเชฟเชฎเชพเชเช เชเชฐเซ เชถเชเซเช เชเซเช.
เชชเซเชฐเชฆเชฐเซเชถเชจ เชเชเชฒเซเช เชธเชพเชฐเซเช เชเซ เชเซ เชเชชเชฃเซ เชธเชเชญเชตเชคเช เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชเชฟเชเชฒเซ เชชเชฟเชตเซเชเชฟเชเช เชเซเชทเซเชเชเซ เชตเชฟเชถเซ เชตเชฟเชเชพเชฐเชตเซเช เชชเชกเชถเซ เชจเชนเซเช. เช เชเชพเช, เช เชฎเชพเชฐเซ เช เชชเชพเชเซ เชชเชฐเซเชเซเชตเซเช เชชเชฐ เช เชชเชฒเซเชก เชเชฐเซเชจเซ เชตเชฐเซเชเซเชเชพเชฎเชพเชเชฅเซ เชชเซเชจเชเชชเซเชฐเชพเชชเซเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฒ เชกเซเชเชพเชจเชพ เชชเชฟเชตเช เชเชฐเชตเชพ เชชเชกเชคเชพ เชนเชคเชพ.
เชเชฎเชจเชธเซเชฌเซ, เชเซเชฐเชพเชซ DBMS เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชฌเซเชเซ เชชเซเชฐเชฏเชพเชธ เช เชธเชซเชณ เชฐเชนเซเชฏเซ. เชฎเชจเซ JanusGraph เชชเชพเชธเซ เชฎเซเชคเซเชฐเซเชชเซเชฐเซเชฃ เชเชเซเชธเชฟเชธเซเชเชฎ เชจเชฅเซ เชฎเชณเซเชฏเซเช เชเซเชฃเซ เชเชคเซเชชเชพเชฆเชจ เชธเชพเชฅเซ เชเชกเชช เชฎเซเชณเชตเชตเชพเชจเซเช เชธเชฐเชณ เชฌเชจเชพเชตเซเชฏเซเช. เชคเซ เช เชธเชฎเชฏเซ, เชธเชฐเซเชตเชฐเชจเซ เชเซเช เชตเชตเชพ เชฎเชพเชเซ, เชชเชฐเชเชชเชฐเชพเชเชค เชเชพเชตเชพ เชฐเซเชคเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชเชพเชตเชพเชฅเซ เชชเชฐเชฟเชเชฟเชค เชจ เชนเซเชฏ เชคเซเชตเชพ เชฒเซเชเซเชจเซ เชฒเซเชนเซเชจเชพ เชเชเชธเซ เชฐเชกเชพเชตเชถเซ:
host: 0.0.0.0
port: 8182
threadPoolWorker: 1
gremlinPool: 8
scriptEvaluationTimeout: 30000
channelizer: org.janusgraph.channelizers.JanusGraphWsAndHttpChannelizer
graphManager: org.janusgraph.graphdb.management.JanusGraphManager
graphs: {
ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.properties,
airlines: conf/airlines.properties
}
scriptEngines: {
gremlin-groovy: {
plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/airline-sample.groovy]}}}}
serializers:
# GraphBinary is here to replace Gryo and Graphson
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}
# Gryo and Graphson, latest versions
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
# Older serialization versions for backwards compatibility:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
processors:
- { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
- { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
metrics: {
consoleReporter: {enabled: false, interval: 180000},
csvReporter: {enabled: false, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
jmxReporter: {enabled: false},
slf4jReporter: {enabled: true, interval: 180000},
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
graphiteReporter: {enabled: false, interval: 180000}}
threadPoolBoss: 1
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferHighWaterMark: 32768
writeBufferHighWaterMark: 65536
ssl: {
enabled: false}
เชนเซเช เชเชเชธเซเชฎเชฟเช เชฐเซเชคเซ JanusGraph เชจเชพ BerkeleyDB เชตเชฐเซเชเชจเชจเซ "เชฎเซเชเชตเชพเชฎเชพเช" เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซ.
เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพเชเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ เชคเชฆเซเชฆเชจ เชเซเชเชฟเชฒ เชเซ, เชเชพเชฐเชฃ เชเซ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพเชเชจเซเช เชธเชเชเชพเชฒเชจ เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชเซเชฐเซเชตเซเชฎเชพเช เชเชเชเช เชตเชฟเชเชฟเชคเซเชฐ เชถเชพเชฎเชจเชตเชพเชฆ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชฐเซเชฎเชฒเชฟเชจ เชเชจเซเชธเซเชฒเชฎเชพเช เชเซเชก เชฒเชเซเชจเซ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ เชฌเชจเชพเชตเชตเซ เชเชตเชถเซเชฏเช เชเซ (เชเซ, เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชฌเซเชเซเชธเชจเซ เชฌเชนเชพเชฐ เชเชพเชฎ เชเชฐเชคเซเช เชจเชฅเซ). เชธเชคเซเชคเชพเชตเชพเชฐ เชเชพเชจเซเชธเชเซเชฐเชพเชซ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃเชฎเชพเชเชฅเซ:
graph.tx().rollback() //Never create new indexes while a transaction is active
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
age = mgmt.getPropertyKey('age')
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex()
mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
mgmt.commit()
//Wait for the index to become available
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameComposite').call()
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameAndAgeComposite').call()
//Reindex the existing data
mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get()
mgmt.commit()
เชเชเซเชเชพเชฐเชฃ
เชเช เช เชฐเซเชฅเชฎเชพเช, เชเชชเชฐเซเชเซเชค เชชเซเชฐเชฏเซเช เชเชฐเชฎ เช เชจเซ เชจเชฐเชฎ เชตเชเซเชเซเชจเซ เชธเชฐเชเชพเชฎเชฃเซ เชเซ. เชเซ เชคเชฎเซ เชคเซเชจเชพ เชตเชฟเชถเซ เชตเชฟเชเชพเชฐเซ เชเซ, เชคเซ เชเซเชฐเชพเชซ DBMS เชธเชฎเชพเชจ เชชเชฐเชฟเชฃเชพเชฎเซ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เช เชจเซเชฏ เชเชพเชฎเชเซเชฐเซ เชเชฐเซ เชเซ. เชเซ เชเซ, เชชเชฐเซเชเซเชทเชฃเซเชจเชพ เชญเชพเช เชฐเซเชชเซ, เชฎเซเช เชตเชฟเชจเชเชคเซ เชธเชพเชฅเซ เชเช เชชเซเชฐเชฏเซเช เชชเชฃ เชเชฐเซเชฏเซ เชนเชคเซ เชเซเชฎ เชเซ:
g.V().hasLabel('ZoneStep').has('id',0)
.repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',1)).count().next()
เชเซ เชเชพเชฒเชตเชพเชจเซเช เช
เชเชคเชฐ เชฆเชฐเซเชถเชพเชตเซ เชเซ. เชเซ เชเซ, เชเชตเชพ เชกเซเชเชพ เชชเชฐ เชชเชฃ, เชเชฒเซเช DBMS เช เชชเชฐเชฟเชฃเชพเชฎเซ เชฌเชคเชพเชตเซเชฏเชพ เชเซ เชฅเซเชกเซเช เชธเซเชเชเชกเชฅเซ เชเชเชณ เชตเชงเซ เชเชฏเชพ... เช, เช
เชฒเชฌเชคเซเชค, เช เชนเชเซเชเชคเชจเซ เชเชพเชฐเชฃเซ เชเซ เชเซ เชคเซเชฏเชพเช เชชเชพเชฅ เชนเชคเชพ เชเซเชฎ เชเซ 0 -> X -> Y ... -> 1
, เชเซ เชเซเชฐเชพเชซ เชเชจเซเชเชฟเชจเซ เชชเชฃ เชคเชชเชพเชธเซเชฏเซเช เชนเชคเซเช.
เชเซเชฎ เชเซ เชเซเชตเซเชฐเซ เชฎเชพเชเซ เชชเชฃ:
g.V().hasLabel('ZoneStep').has('id',0).out().has('id',1)).count().next()
เชนเซเช เชเช เชธเซเชเชจเซเชก เชเชฐเชคเชพเช เชเชเชพ เชธเชฎเชฏเชจเชพ เชชเซเชฐเซเชธเซเชธเชฟเชเช เชธเชฎเชฏ เชธเชพเชฅเซ เชเชคเซเชชเชพเชฆเช เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซเชณเชตเชตเชพเชฎเชพเช เช เชธเชฎเชฐเซเชฅ เชนเชคเซ.
เชตเชพเชฐเซเชคเชพเชจเซ เชจเซเชคเชฟเชเชคเชพ เช เชเซ เชเซ เชเช เชธเซเชเชฆเชฐ เชตเชฟเชเชพเชฐ เช เชจเซ เชจเชฎเซเชจเชพเชฐเซเชช เชฎเซเชกเซเชฒเชฟเชเช เชเชเซเชเชฟเชค เชชเชฐเชฟเชฃเชพเชฎ เชคเชฐเชซ เชฆเซเชฐเซ เชเชคเซเช เชจเชฅเซ, เชเซ เชเซเชฒเชฟเชเชนเชพเชเชธเชจเชพ เชเชฆเชพเชนเชฐเชฃเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชฃเซ เชเชเซเช เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชธเชพเชฅเซ เชฆเชฐเซเชถเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เช เชฒเซเชเชฎเชพเช เชชเซเชฐเชธเซเชคเซเชค เชเชชเชฏเซเช เชเซเชธ เชเซเชฐเชพเชซ DBMSs เชฎเชพเชเซ เชธเซเชชเชทเซเช เชตเชฟเชฐเซเชงเซ เชชเซเชเชฐเซเชจ เชเซ, เชเซ เชเซ เชคเซ เชคเซเชฎเชจเชพ เชฆเชพเชเชฒเชพเชฎเชพเช เชฎเซเชกเซเชฒเชฟเชเช เชฎเชพเชเซ เชฏเซเชเซเชฏ เชฒเชพเชเซ เชเซ.
เชธเซเชฐเซเชธ: www.habr.com