He aha te mea ka penapena nga raraunga katoa ki te mahara?
Hei rokiroki i nga raraunga o te waahi, o muri ranei, ko te hiahia tuatahi o te nuinga o nga tangata whai whakaaro ko te kowhiri i tetahi papaa raraunga SQL.
Engari i etahi wa ka puta te whakaaro ko te tauira raraunga kaore i te pai mo te SQL: hei tauira, i te wa e hanga ana he rapunga, he kauwhata hapori ranei, me rapu koe mo nga hononga uaua i waenga i nga taonga.
Ko te ahuatanga kino rawa atu ko te wa e mahi ana koe i roto i te roopu, kaore tetahi hoa mahi e mohio ki te hanga patai tere. E hia te roa o te wa i whakapaua e koe ki te whakaoti rapanga N+1 me te hanga i etahi atu taurangi kia oti ai te SELECT i te wharangi matua i roto i te wa tika?
Ko tetahi atu huarahi rongonui ko NoSQL. He maha nga tau kua pahure ake nei he maha nga korero mo tenei kaupapa - mo nga wa pai i tukuna e ratou a MongoDB me te koa ki nga whakautu i te ahua o nga tuhinga json (Ae ra, e hia nga tootoo i whakauruhia e koe na nga hononga porohita kei roto i nga tuhinga?).
Ka whakaaro ahau ki te whakamatau i tetahi atu tikanga rereke - he aha e kore ai e ngana ki te penapena i nga raraunga katoa i roto i te mahara tono, ka penapena i ia wa ki te rokiroki matapōkere (kōnae, pātengi raraunga mamao)?
Kua iti te mahara, a ko nga raraunga ka taea mo te nuinga o nga kaupapa iti me te reo-rahi ka uru ki te 1 GB o te mahara. (Hei tauira, ko taku kaupapa kainga tino pai ko
Kaupapa:
- Ka ngawari ake te uru ki nga raraunga - kare koe e awangawanga mo nga paatai, te uta mangere, nga ahuatanga ORM, ka mahi koe me nga taonga C# noa;
- Kaore he raruraru e pa ana ki te uru mai i nga miro rereke;
- Tino tere - karekau he tono whatunga, karekau he whakamaoritanga o te waehere ki roto i te reo patai, karekau he take (de)whakaraupapatanga o nga mea;
- Ka whakaaetia te penapena raraunga ahakoa te ahua - ahakoa kei te XML i runga i te kōpae, kei te SQL Server ranei, kei te Rokiroki Ripanga Azure ranei.
Cons:
- Kua ngaro te tauine whakapae, a, ko te mutunga mai, kaore e taea te tukunga wa-kore;
- Mena ka pakaru te tono, ka ngaro pea koe i tetahi waahanga raraunga. (Engari ko ta maatau tono kaore e pakaru, tika?)
Ka pēhea te mahi i te reira?
Ko te algorithm e whai ake nei:
- I te timatanga, ka whakapumautia he hononga ki te rokiroki raraunga, ka utaina nga raraunga;
- Ka hangaia he tauira ahanoa, nga tohu tuatahi, me nga tohu hononga (1:1, 1:Many);
- Ka hangaia he ohaurunga mo nga huringa o nga taonga ahanoa (INotifyPropertyChanged) me te taapiri, te tango ranei i nga huānga ki te kohinga (INotifyCollectionChanged);
- I te wa e whakaohohia ana te ohaurunga, ka taapirihia te mea kua whakarereketia ki te rarangi mo te tuhi ki te rokiroki raraunga;
- Ko nga huringa ki te rokiroki ka tiakina i ia wa (i runga i te matawā) ki te miro papamuri;
- Ka puta koe i te tono, ka tiakina hoki nga huringa ki te rokiroki.
Tauira waehere
Te taapiri i nga whakawhirinaki e tika ana
// Основная библиотека
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
Ka whakaahuahia e matou te tauira raraunga ka penapena ki te rokiroki
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; }
}
Na ko te tauira ahanoa:
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;
}
Ka mutu, ko te akomanga putunga ake mo te uru ki nga raraunga:
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();
}
}
Waihangahia he tauira ObjectRepository:
var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();
Mena ka whakamahia e te kaupapa HangFire
public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}
Kōkuhu ahanoa hōu:
var newParent = new ParentModel()
repository.Add(newParent);
Ki tenei karanga, te ahanoa Tauira Matua ka taapirihia ki te keteroki o te rohe me te rarangi mo te tuhi ki te papaunga raraunga. No reira, ka tango tenei mahi i te O(1), ka taea te mahi tonu tenei ahanoa.
Hei tauira, ki te kimi i tenei ahanoa i roto i te putunga me te manatoko he rite tonu te tauira i whakahokia mai:
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));
He aha kei te tupu? Tautuhi () hoki mai Papakupu Ripanga, kei roto Papakupu Taurite me te whakarato mahi taapiri o nga tohu tuatahi me te tuarua. Ma tenei ka taea e koe te whai tikanga mo te rapu ma te Id (me etahi atu taurangi kaiwhakamahi kore noa) me te kore e huri katoa i nga mea katoa.
I te taapiri taonga ki ObjectRepository ka taapirihia he ohaurunga ki te whakarereke i o raatau taonga, no reira ko te whakarereketanga o nga taonga ka uru ano tenei mea ki te rarangi tuhi.
He rite te ahua o te whakahōu i nga taonga o waho ki te mahi me te ahanoa POCO:
myParent.Children.First().Property = "Updated value";
Ka taea e koe te muku i tetahi mea ma nga huarahi e whai ake nei:
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());
Ka taapiri ano tenei i te ahanoa ki te rarangi mukunga.
Me pehea te mahi penapena?
ObjectRepository ka huri nga mea ka tirohia (te taapiri, te whakakore ranei, te whakarereke ranei i nga ahuatanga), ka whakaarahia he huihuinga Tauira Huriohauru ki IS Rokiroki. Whakatinanatanga IS Rokiroki ina puta he kaupapa Tauira Huri Ka whakauruhia nga huringa ki nga rarangi e 3 - mo te taapiri, mo te whakahou, mo te whakakore.
Te whakatinana hoki IS Rokiroki i runga i te arawhitinga, ka waihangahia e ratou he matawā ka tiakina nga huringa ia 5 hēkona.
I tua atu, he API hei akiaki i te waea whakaora: ObjectRepository.Tiaki().
I mua i ia penapena, ka tangohia tuatahitia nga mahi horihori mai i nga rarangi (hei tauira, nga takahanga taarua - i te wa e rua te whakarereketanga o tetahi mea, ka tere ranei te taapiri/tango ahanoa), katahi ka tiakina ano.
I nga wa katoa, ka tiakina katoatia te ahanoa o naianei, no reira ka taea te tiaki i nga taonga i roto i te raupapa rereke atu i era i whakarereketia, tae atu ki nga waahanga hou ake o nga mea i te wa i taapirihia ki te rarangi.
He aha atu ano?
- Ko nga whare pukapuka katoa kei runga i te .NET Standard 2.0. Ka taea te whakamahi i tetahi kaupapa .NET hou.
- He haumaru te API. Ka whakatinanahia nga kohinga o roto i runga i Papakupu Taurite, he raka nga kaikawe huihuinga, kaore ranei e hiahiatia.
Ko te mea anake hei maumahara ko te waea ObjectRepository.Tiaki(); - Taupū takahuri (me whai ahurei):
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");
Ma wai e whakamahi?
Ko ahau ake, i timata ahau ki te whakamahi i tenei huarahi i roto i nga kaupapa whakangahau katoa na te mea he watea, kaore hoki he utu nui mo te tuhi i tetahi paparanga urunga raraunga, ki te whakamahi hanganga taumaha ranei. Ko te mea, ko te penapena raraunga ki roto i te litedb, i te konae ranei he mea nui ki ahau.
Engari i nga wa o mua, i te wa kua ngaro te tiimata o te EscapeTeams (I whakaaro ahau koinei, he moni - engari kaore, he wheako ano) - whakamahia hei rokiroki raraunga ki te Rokiroki Ripanga Azure.
Mahere mo te heke mai
Kei te pirangi ahau ki te whakatika i tetahi o nga tino ngoikoretanga o tenei huarahi - te whakatauira whakapae. Hei mahi i tenei, ka hiahia koe ki nga whakawhitiwhitinga tohatoha (sic!), Ka whakatauhia ranei kia kore e rereke nga raraunga mai i nga ahuatanga rereke, me whakarereke ranei i runga i te kaupapa "ko wai te mea whakamutunga ka tika."
Mai i te tirohanga hangarau, ka kite ahau i te kaupapa e whai ake nei ka taea:
- Rokiroki EventLog me te Snapshot hei utu mo te tauira ahanoa
- Kimihia etahi atu tauira (tapirihia nga waahi mutunga o nga tauira katoa ki nga tautuhinga? udp discovery? master/slave?)
- Whakatauritehia i waenga i nga kaupapa EventLog ma tetahi algorithm whakaaetanga, penei i te RAFT.
He raru ano kei te awangawanga ahau - ko te whakakore i te riipene, te kitenga ranei o nga keehi mo te whakakorenga o nga mea he hononga mai i etahi atu mea.
Waehere puna
Mena kua panui katoa koe ki konei, ko te toenga ko te panui i te waehere; ka kitea i runga i GitHub:
Source: will.com