ãªããã¹ãŠã®ããŒã¿ãã¡ã¢ãªã«ä¿åããã®ã§ãããã?
Web ãµã€ããããã¯ãšã³ãã®ããŒã¿ãä¿åããããã«ãã»ãšãã©ã®è¯èãã人ãæåã«æãã®ã¯ãSQL ããŒã¿ããŒã¹ãéžæããããšã§ãããã
ããããããŒã¿ ã¢ãã«ã SQL ã«é©ããŠããªããšããèããé ã«æµ®ãã¶ããšããããŸããããšãã°ãæ€çŽ¢ããœãŒã·ã£ã« ã°ã©ããæ§ç¯ããå Žåããªããžã§ã¯ãéã®è€éãªé¢ä¿ãæ€çŽ¢ããå¿ èŠããããŸãã
ææªã®ç¶æ³ã¯ãããŒã ã§äœæ¥ããŠããŠãååãç°¡åãªã¯ãšãªã®äœææ¹æ³ãç¥ããªãå Žåã§ãã ã¡ã€ã³ ããŒãžã® SELECT ãé©åãªæéå ã«å®äºããããã«ãN+1 ã®åé¡ã解決ããè¿œå ã®ã€ã³ããã¯ã¹ãæ§ç¯ããã®ã«ã©ã®ãããã®æéãè²»ãããŸããã?
ãã XNUMX ã€ã®äžè¬çãªã¢ãããŒã㯠NoSQL ã§ãã æ°å¹Žåããã®ãããã¯ã«é¢ããŠã¯å€ãã®èªå€§å®£äŒããããŸãã - éœåã®è¯ãæ©äŒã«åããŠã圌ã㯠MongoDB ããããã€ããjson ããã¥ã¡ã³ãã®åœ¢åŒã§çãã«æºè¶³ããŠããŸãã (ãšããã§ãææžå ã«åŸªç°ãªã³ã¯ããããããæŸèæãäœæ¬æ¿å ¥ããå¿ èŠããããŸããã?).
å¥ã®ä»£æ¿æ¹æ³ãè©ŠããŠã¿ãããšããå§ãããŸãããã¹ãŠã®ããŒã¿ãã¢ããªã±ãŒã·ã§ã³ ã¡ã¢ãªã«ä¿åããå®æçã«ã©ã³ãã ã¹ãã¬ãŒãž (ãã¡ã€ã«ããªã¢ãŒã ããŒã¿ããŒã¹) ã«ä¿åããŠã¿ãŠã¯ãããã§ããããã
ã¡ã¢ãªã¯å®äŸ¡ã«ãªããã»ãšãã©ã®äžå°èŠæš¡ã®ãããžã§ã¯ãã§äœ¿çšå¯èœãªããŒã¿ã¯ãã¹ãŠ 1 GB ã®ã¡ã¢ãªã«åãŸããŸãã (ããšãã°ãç§ã®ãæ°ã«å
¥ãã®ããŒã ãããžã§ã¯ãã¯
é·æïŒ
- ããŒã¿ãžã®ã¢ã¯ã»ã¹ã容æã«ãªããŸããã¯ãšãªãé 延èªã¿èŸŒã¿ãORM æ©èœã«ã€ããŠå¿é ããå¿ èŠã¯ãªããéåžžã® C# ãªããžã§ã¯ããæäœã§ããŸãã
- ç°ãªãã¹ã¬ããããã®ã¢ã¯ã»ã¹ã«é¢é£ããåé¡ã¯ãããŸããã
- éåžžã«é«é - ãããã¯ãŒã¯ ãªã¯ãšã¹ããã³ãŒãã®ã¯ãšãªèšèªãžã®å€æããªããžã§ã¯ãã® (é) ã·ãªã¢ã«åã¯å¿ èŠãããŸããã
- ããŒã¿ã¯ããã£ã¹ã¯äžã® XMLãSQL ServerãAzure Table Storage ãªã©ããããã圢åŒã§ä¿åã§ããŸãã
çæïŒ
- æ°Žå¹³æ¹åã®ã¹ã±ãŒãªã³ã°ã倱ããããã®çµæããŒã ããŠã³ã¿ã€ã ã®å±éãè¡ãããšãã§ããªããªããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãããšãããŒã¿ãéšåçã«å€±ãããå¯èœæ§ããããŸãã (ã§ããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããããšã¯ãããŸãããã?)
ããã¯ã©ã®ããã«åäœããŸããïŒ
ã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ãã
- æåã«ãããŒã¿ ã¹ãã¬ãŒãžãšã®æ¥ç¶ã確ç«ãããããŒã¿ãããŒããããŸãã
- ãªããžã§ã¯ã ã¢ãã«ããã©ã€ã㪠ã€ã³ããã¯ã¹ãããã³ãªã¬ãŒã·ã§ãã« ã€ã³ããã¯ã¹ (1:1ã1:Many) ãæ§ç¯ãããŸãã
- ãµãã¹ã¯ãªãã·ã§ã³ã¯ããªããžã§ã¯ã ããããã£ã®å€æŽ (INotifyPropertyChanged)ãããã³ã³ã¬ã¯ã·ã§ã³ãžã®èŠçŽ ã®è¿œå ãŸãã¯åé€ (INotifyCollectionChanged) ã®ããã«äœæãããŸãã
- ãµãã¹ã¯ãªãã·ã§ã³ãããªã¬ãŒããããšãå€æŽããããªããžã§ã¯ããããŒã¿ ã¹ãã¬ãŒãžã«æžã蟌ãããã®ãã¥ãŒã«è¿œå ãããŸãã
- ã¹ãã¬ãŒãžãžã®å€æŽã¯ãããã¯ã°ã©ãŠã³ã ã¹ã¬ããã§å®æçã« (ã¿ã€ããŒã«åŸã£ãŠ) ä¿åãããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãçµäºãããšãå€æŽå 容ãã¹ãã¬ãŒãžã«ä¿åãããŸãã
ã³ãŒãäŸ
å¿ èŠãªäŸåé¢ä¿ãè¿œå ãã
// ÐÑÐœÐŸÐ²ÐœÐ°Ñ Ð±ÐžÐ±Ð»ÐžÐŸÑека
Install-Package OutCode.EscapeTeams.ObjectRepository
// Ð¥ÑаМОлОÑе ЎаММÑÑ
, в кПÑПÑПЌ бÑÐŽÑÑ ÑПÑ
ÑаМÑÑÑÑÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ
// ÐÑпПлÑзÑйÑе ÑП, кПÑПÑÑÐŒ бÑЎеÑе пПлÑзПваÑÑÑÑ.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
// ÐпÑОПМалÑМП - еÑлО ÐœÑжМП Ñ
ÑаМОÑÑ ÐŒÐŸÐŽÐµÐ»Ñ ÐŽÐ°ÐœÐœÑÑ
ÐŽÐ»Ñ Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.Hangfire
ã¹ãã¬ãŒãžã«ä¿åãããããŒã¿ã¢ãã«ã«ã€ããŠèª¬æããŸãã
public class ParentEntity : BaseEntity
{
public ParentEntity(Guid id) => Id = id;
}
public class ChildEntity : BaseEntity
{
public ChildEntity(Guid id) => Id = id;
public Guid ParentId { get; set; }
public string Value { get; set; }
}
次ã«ããªããžã§ã¯ã ã¢ãã«:
public class ParentModel : ModelBase
{
public ParentModel(ParentEntity entity)
{
Entity = entity;
}
public ParentModel()
{
Entity = new ParentEntity(Guid.NewGuid());
}
public Guid? NullableId => null;
// ÐÑÐžÐŒÐµÑ ÑвÑзО 1:Many
public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
protected override BaseEntity Entity { get; }
}
public class ChildModel : ModelBase
{
private ChildEntity _childEntity;
public ChildModel(ChildEntity entity)
{
_childEntity = entity;
}
public ChildModel()
{
_childEntity = new ChildEntity(Guid.NewGuid());
}
public Guid ParentId
{
get => _childEntity.ParentId;
set => UpdateProperty(() => _childEntity.ParentId, value);
}
public string Value
{
get => _childEntity.Value;
set => UpdateProperty(() => _childEntity.Value, value
}
// ÐПÑÑÑп Ñ Ð¿ÐŸÐžÑкПЌ пП ОМЎекÑÑ
public ParentModel Parent => Single<ParentModel>(ParentId);
protected override BaseEntity Entity => _childEntity;
}
æåŸã«ãããŒã¿ã«ã¢ã¯ã»ã¹ããããã®ãªããžã㪠ã¯ã©ã¹èªäœã§ãã
public class MyObjectRepository : ObjectRepositoryBase
{
public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
{
IsReadOnly = true; // ÐÐ»Ñ ÑеÑÑПв, пПзвПлÑÐµÑ ÐœÐµ ÑПÑ
ÑаМÑÑÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð² базÑ
AddType((ParentEntity x) => new ParentModel(x));
AddType((ChildEntity x) => new ChildModel(x));
// ÐÑлО ОÑпПлÑзÑеÑÑÑ Hangfire О МеПбÑ
ПЎОЌП Ñ
ÑаМОÑÑ ÐŒÐŸÐŽÐµÐ»Ñ ÐŽÐ°ÐœÐœÑÑ
ÐŽÐ»Ñ Hangfire в ObjectRepository
// this.RegisterHangfireScheme();
Initialize();
}
}
ObjectRepository ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãã
var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();
ãããžã§ã¯ã㧠HangFire ã䜿çšããå Žå
public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}
æ°ãããªããžã§ã¯ãã®æ¿å ¥:
var newParent = new ParentModel()
repository.Add(newParent);
ãã®åŒã³åºãã«ããããªããžã§ã¯ã㯠芪ã¢ãã« ããŒã«ã« ãã£ãã·ã¥ãšããŒã¿ããŒã¹ãžã®æžã蟌ã¿ãã¥ãŒã®äž¡æ¹ã«è¿œå ãããŸãã ãããã£ãŠããã®æäœã«ã¯ O(1) ããããããã®ãªããžã§ã¯ãã¯ããã«æäœã§ããŸãã
ããšãã°ããªããžããªå ã§ãã®ãªããžã§ã¯ããæ€çŽ¢ããè¿ããããªããžã§ã¯ããåãã€ã³ã¹ã¿ã³ã¹ã§ããããšã確èªããã«ã¯ã次ã®ããã«ããŸãã
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));
äœãèµ·ãã£ãŠããïŒ ã»ãã() æ»ã ããŒãã«èŸæžã ãå«ã åæèŸæž ãŸãããã©ã€ã㪠ã€ã³ããã¯ã¹ãšã»ã«ã³ã㪠ã€ã³ããã¯ã¹ã®è¿œå æ©èœãæäŸããŸãã ããã«ããããã¹ãŠã®ãªããžã§ã¯ããå®å šã«å埩åŠçããããšãªããID (ãŸãã¯ãã®ä»ã®ä»»æã®ãŠãŒã¶ãŒ ã€ã³ããã¯ã¹) ã«ãã£ãŠæ€çŽ¢ããã¡ãœããã䜿çšã§ããããã«ãªããŸãã
ãªããžã§ã¯ããè¿œå ãããšãã¯ã ãªããžã§ã¯ããªããžã㪠ãµãã¹ã¯ãªãã·ã§ã³ã¯ããããã£ãå€æŽããããã«è¿œå ããããããããããã£ãå€æŽããããšããã®ãªããžã§ã¯ããæžã蟌ã¿ãã¥ãŒã«è¿œå ãããŸãã
å€éšããããããã£ãæŽæ°ããããšã¯ãPOCO ãªããžã§ã¯ããæäœããããšãšåãããã«èŠããŸãã
myParent.Children.First().Property = "Updated value";
次ã®æ¹æ³ã§ãªããžã§ã¯ããåé€ã§ããŸãã
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());
ããã«ããããªããžã§ã¯ããåé€ãã¥ãŒã«è¿œå ãããŸãã
ä¿åã¯ã©ã®ããã«æ©èœããŸãã?
ãªããžã§ã¯ããªããžã㪠ç£èŠå¯Ÿè±¡ã®ãªããžã§ã¯ããå€æŽããããš (è¿œå ãŸãã¯åé€ããŸãã¯ããããã£ã®å€æŽã®ãããã)ãã€ãã³ããçºçããŸãã ã¢ãã«ãå€æŽãããŸãã賌èªããŸãã Iã¹ãã¬ãŒãžã å®è£ Iã¹ãã¬ãŒãž ã€ãã³ããçºçãããšã ã¢ãã«ãå€æŽãããŸãã å€æŽã¯ãè¿œå ãæŽæ°ãåé€ã® 3 ã€ã®ãã¥ãŒã«å ¥ããããŸãã
å®è£ ã Iã¹ãã¬ãŒãž åæåæã«ã5 ç§ããšã«å€æŽãä¿åããã¿ã€ããŒãäœæããŸãã
ããã«ãä¿ååŒã³åºãã匷å¶ãã API ããããŸãã ObjectRepository.Save().
åä¿åã®åã«ãç¡æå³ãªæäœ (ããšãã°ããªããžã§ã¯ãã XNUMX åå€æŽããããšããããªããžã§ã¯ããããã«è¿œå /åé€ããããšãã®éè€ã€ãã³ããªã©) ããã¥ãŒããåé€ããããã®åŸãä¿åèªäœãåé€ãããŸãã
ãããã®å ŽåããçŸåšã®ãªããžã§ã¯ãå šäœãä¿åãããããããã¥ãŒã«è¿œå ãããæç¹ãããæ°ããããŒãžã§ã³ã®ãªããžã§ã¯ããå«ãããªããžã§ã¯ããå€æŽãããé åºãšã¯ç°ãªãé åºã§ä¿åãããå¯èœæ§ããããŸãã
ä»ã«ã¯äœãããã®ïŒ
- ãã¹ãŠã®ã©ã€ãã©ãªã¯ .NET Standard 2.0 ã«åºã¥ããŠããŸãã ææ°ã® .NET ãããžã§ã¯ãã§äœ¿çšã§ããŸãã
- API ã¯ã¹ã¬ããã»ãŒãã§ãã å
éšã³ã¬ã¯ã·ã§ã³ã¯ä»¥äžã«åºã¥ããŠå®è£
ãããŸãã ã³ã³ã«ã¬ã³ãèŸæžãã€ãã³ã ãã³ãã©ãŒã«ã¯ããã¯ãããããããã¯ãå¿
èŠãããŸããã
èŠããŠãã䟡å€ãããå¯äžã®ããšã¯ãé»è©±ããããšã§ã ObjectRepository.Save(); - ä»»æã®ã€ã³ããã¯ã¹ (äžææ§ãå¿ èŠ):
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");
誰ã䜿ãã®ïŒ
å人çã«ã¯ããã®ã¢ãããŒãã䟿å©ã§ãããŒã¿ ã¢ã¯ã»ã¹ ã¬ã€ã€ãŒã®äœæãéãã€ã³ãã©ã¹ãã©ã¯ãã£ã®å±éã«å€é¡ã®è²»çšãããããªãããããã¹ãŠã®è¶£å³ã®ãããžã§ã¯ãã§ãã®ã¢ãããŒãã䜿çšãå§ããŸããã å人çã«ã¯ãããŒã¿ã litedb ãŸãã¯ãã¡ã€ã«ã«ä¿åããã ãã§éåžžã¯ååã§ãã
ãããéå»ã«ãä»ã¯ãªãã¹ã¿ãŒãã¢ãã EscapeTeams (ããã«ãéããããšæã£ãããéãããŸãçµéšã ) - Azure Table Storage ã«ããŒã¿ãä¿åããããã«äœ¿çšãããŸãã
å°æ¥ã®èšç»
ãã®ã¢ãããŒãã®äž»ãªæ¬ ç¹ã® XNUMX ã€ã§ããæ°Žå¹³ã¹ã±ãŒãªã³ã°ãä¿®æ£ããããšæããŸãã ãããè¡ãã«ã¯ãåæ£ãã©ã³ã¶ã¯ã·ã§ã³ (åæã©ãã!) ã䜿çšããããç°ãªãã€ã³ã¹ã¿ã³ã¹ããã®åãããŒã¿ãå€æŽãã¹ãã§ã¯ãªããšãã匷ãæå¿ã®æ±ºå®ãäžããããæåŸã«æ®ã£ãè ãæ£ããããšããååã«åŸã£ãŠããŒã¿ãå€æŽããããã®ãããããå¿ èŠã§ãã
æè¡çãªèŠ³ç¹ãããç§ã¯æ¬¡ã®ã¹ããŒã ãå¯èœã§ãããšèããŠããŸãã
- ãªããžã§ã¯ãã¢ãã«ã®ä»£ããã«ã€ãã³ããã°ãšã¹ãããã·ã§ãããä¿å
- ä»ã®ã€ã³ã¹ã¿ã³ã¹ãæ€çŽ¢ããŸã (ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã®ãšã³ããã€ã³ããèšå®ã«è¿œå ããŸãã? udp æ€åº? ãã¹ã¿ãŒ/ã¹ã¬ãŒã?)
- RAFT ãªã©ã®ã³ã³ã»ã³ãµã¹ ã¢ã«ãŽãªãºã ãä»ã㊠EventLog ã€ã³ã¹ã¿ã³ã¹éã§ã¬ããªã±ãŒãããŸãã
ãã XNUMX ã€æ°ã«ãªãåé¡ããããŸããã«ã¹ã±ãŒãåé€ãã€ãŸãä»ã®ãªããžã§ã¯ãããã®ãªã³ã¯ãæã€ãªããžã§ã¯ããåé€ãããã±ãŒã¹ã®æ€åºã§ãã
ãœãŒã¹ã³ãŒã
ãããŸã§èªãã ããããšã¯ã³ãŒããèªãã ãã§ããã³ãŒã㯠GitHub ã«ãããŸãã
åºæïŒ habr.com