Metin içi meta verileri ayrı bir veri yapısında saklama


14

Satır içi , intext meta verilerini depolaması gereken bir uygulama geliştiriyorum . Bununla ne demek istediğim şudur: diyelim ki uzun bir metnimiz var ve belirli bir kelimeyle veya metnin cümlesiyle bağlantılı bazı meta verileri saklamak istiyoruz.

Bu bilgileri depolamanın en iyi yolu ne olabilir?

Benim ilk düşünce metnin çeşit dahil etmek oldu Markdownsözdizimi sonra alınırken üzerinde çözümlenen. Şuna benzer bir şey:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[@note this sounds really funny latin]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Bu, düşünebileceğim iki sorun yaratacaktır:

  1. Nispeten küçük olanı, eğer sözdizimi söz konusu metinde tesadüfen gerçekleşirse, ayrıştırma ile karışabilir.
  2. En önemlisi, bunun bu meta verileri metnin kendisinden ayrı tutmamasıdır.

Sorgulama, istatistik, sıralama, vb: Onları farklı şekillerde kullanabilirsiniz böylece bu verileri, bu meta verilerin depolandığı böyle farklı bir DB Tablosu tutmak için ayrı bir veri yapısı istiyorum.


DÜZENLEME: Yanıtlayıcı yanıtını sildiğinden , bu ilk kavramı genişleten uygulanabilir bir öneri olduğu için öneriyi buraya eklemek iyi olabilir diye düşünüyorum . Poster benzer bir sözdizimi kullanmak, ancak meta veri bağlamak için önerilen PRIMARY KEYbir metadataveritabanı tablosunun.

Şöyle görünecek bir şey:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam __nonummy nibh__[15432]
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Aşağıdaki örneğe göre gerekli, sorgulanabilir bilgileri içeren bir tablo satırının nerede 15432olacağı ID.


Benim ikinci düşünce bu gibi bakarak bir DB Tablo bu tür mağaza bilgilerine oldu:

TABLE: metadata

ID    TEXT_ID    TYPE    OFFSET_START    OFFSET_END    CONTENT
1     lipsum     note    68              79            this sounds really funny latin

Bu şekilde meta verilerin benzersiz bir kimliği olacaktır, a text_idmetinleri depolayan tabloya bağlı bir yabancı anahtar ve basit bir karakter ofseti aralığı kullanarak verileri metnin kendisine bağlayacaktır .

Bu, verileri meta verilerden ayrı tutma hilesini yapar , ancak bu yaklaşımla hemen görebildiğim bir sorun, metnin temelde düzenlenebilir olmamasıdır . Ben meta assignation sonra metnin düzenleme uygulamak istiyorsa Veya, temelde önceki sürüme göre karakterler eklemeler veya kaldırma hesaplamak ve kontrol etmesi gerekir her bu değişiklikler önce veya sonra kaldır karakterleri ekler veya her ilgili meta verilerin.

Bana göre bu gerçekten belirsiz bir yaklaşım gibi geliyor.

Soruna nasıl yaklaşabileceğime dair herhangi bir işaret veya öneriniz var mı?


Düzenleme 2: bazı XML sorunları

Bu veri ve meta veri ayrımının gerçekleşmesi için oldukça gerekli olacak başka bir durum eklemek.

  • Farklı kullanıcıların , aynı kullanıcının farklı meta veri kümelerine sahip olmasını, her kullanıcının gerçekte diğer kullanıcı meta verilerini görüntüleme olasılığı olsun veya olmasın mümkün kıldığını varsayalım .

İşaretleme türünün (veya HTML veya XML) herhangi bir çözümünün bu noktada uygulanması zor olacaktır. Bu durumda düşünebildiğim tek çözüm, orijinal metnin tek kullanıcı sürümünü içeren başka bir DB Tablosuna sahip olmak, a kullanarak orijinal metin tablosuna bağlanmak olacaktır FOREIGN KEY.

Bunun da çok zarif olup olmadığından emin değilim.

  • XML hiyerarşik bir veri modeline sahiptir: başka bir öğenin sınırları içinde olan herhangi bir öğe, alt öğe olarak kabul edilir; bu, aradığım veri modelinde çoğu zaman geçerli değildir; XML herhangi çocuklar önce eleman kapalı olmalıdır ebeveyn etiketi kapatılabilir elemanların hiçbir teli¤in izin.

Misal:

<note content="the beginning of the famous placeholder"> Lorem ipsum dolor sit <comment content="I like the sound of amet/elit"> amet </note> , consipetuer adipiscing elit </comment> , <note content="adversative?"> sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.<note content="funny latin"> </note> </note>

Burada iki farklı sorunumuz var:

  1. Üst üste binen farklı unsurlar: İlk yorum ilk nota başlar, ancak ilk notanın bitiminden sonra biter, yani çocuğu değildir.

  2. Üst üste binen aynı öğeler: Son nota ve kalın nota çakışması; bununla birlikte, aynı tür elemanlar olduklarından, ayrıştırıcı son kapanan elemanı ilk kapamada ve son kapamadaki ilk açılmış parçayı kapatır, ki bu durumda amaçlanan şey bu değildir.


3
Kendi biçimlendirme dilinizi yazıyormuşsunuz gibi geliyor. İyi kurulmuş bir ayrıştırma sistemi olan HTML'yi kullanabilir ve elde edilen ayrıştırma ağacını işleyerek metninizi düzenleyebilirsiniz. Veritabanı depolama için bize Oracle'ın XMLDB veya Mark / Logic gibi bir NoSQL db olabilir.
ipaul

Sorun kavramsal olarak o kadar pratik değil. Yani, Ben olabilirdi HTML veya Markdown kullanabilir veya bir ayrıştırıcı ile birlikte benim çok basit biçimlendirme dilini kurmak. Sorun şu ki, bunları ayrı tutmak istiyorum. İçeriği minimumda tutun, belki temel zengin metin bilgilerini içeriğin içinde tutun , ancak diğer her şey ayrı olmalıdır.
Sunyatasattva

1
@Sunyatasattva böyle bir karmaşıklık eklemenin yararı nedir?
Clement Herreman

@ClementHerreman Hangi karmaşıklık eklendi? Verileri ve meta verileri ayrı tutmanın karmaşıklığını mı kastediyorsunuz?
Sunyatasattva

Metin, değiştirilebilen veya güncellenebilen ve metnin çeşitli sürümleri için hangi meta verilerin korunması gereken canlı bir doküman mıdır? Yoksa meta verilerin uygulandığı metin tamamen statik ve değişmez mi?
Kyle Lowry

Yanıtlar:


5

Çözümlerinizin bir karışımını seçerdim, bunun yerine standart bir XML kullanırdım. Bunun gibi bir sözdiziminiz olurdu

Lorem ipsum dolor sit amet, consectetuer adipiscing elit,
sed diam <note content="It sound really funny in latin">nonummy nibh</note>
euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Neden XML

Bunu düşünürseniz , tüm web tam olarak nasıl yapılandırılır : html etiketleri aracılığıyla semantik - meta veri olarak adlandırdığınız şey - taşıyan içerik (gerçek metin) .

Bu şekilde açılan gerçekten harika bir dünya var:

  • Ücretsiz ayrıştırıcı
  • İçeriğe meta veri eklemek için savaşta test edilmiş yol
  • Kullanım kolaylığı (hangi kullanıcıları hedeflediğinize bağlı olarak)
  • XML ayrıştırıcılarında standart bir özellik olduğundan, ham metni meta veri olmadan kolayca ayıklayabilirsiniz. Bu, içeriğinizin dizine eklenebilir bir sürümüne sahip olmak için çok kullanışlıdır, bu nedenle Lorem <note>ipsum</note>, lorem ips*örneğin ararken yükseltilir .

Neden Markdown Üzerinden XML

Stackexchange gibi bir web sitesi, içeriğinin taşıdığı anlambilim olarak işaretleme kullanır: vurgu, bağlantılar / URL'ler, resim, başlık vb. İçeriğinize eklediğiniz anlamsallık

  1. Daha karmaşık
  2. Değişebilir veya genişletilebilir olmalıdır

Bu yüzden Markdown'un gerçekten iyi bir fikir olmayacağını düşünüyorum. Ayrıca Markdown gerçekten standartlaştırılmış olup tam bir baş belası daha da bir olabilir damping / ayrıştırma değil SÖZDİZİMİ markdownish bakın o Markdown ayrıştırma tanıştığı WTF hakkında Jeff Atwood yazı .

Veri ve meta veriler arasında ayrım hakkında

Kendi başına böyle bir ayrım zorunlu değildir. Size getirdiği avantajı aradığınızı varsayıyorum:

  • Meta veri olmadan ham içeriğe sahip olma imkanı
  • Endişelerin ayrılması: Veri nedeniyle meta verileri işlerken yan etki / karmaşıklık yükü istemiyorum, aksi takdirde.

Tüm bu endişeler XML kullanımıyla giderildi. XML'den kolayca etiket çıkartılmış içeriği dökebilir ve veri / meta veriler tıpkı nitelik ve gerçek metin XML'de ayrılmış gibi ayrılır.

Ayrıca, meta verilerinizin gerçekten verilerinize bağlı olmadığını gerçekten de sanmıyorum . Açıkladığınızdan, meta verileriniz verilerinizin bir bileşimidir, yani verilerin silinmesi meta verilerin silinmesine yol açar. Burası meta verilerin normal HTML / CSS'den ayrıldığı yerdir. Bir html öğesi kaldırıldığında CSS, diğer öğelere uygulanabileceğinden endişelenmez. Meta verilerinizde böyle olduğunu düşünmüyorum.

Metadata, XML veya Markdown'da olduğu gibi verilere yakın olması, verilerin kolay anlaşılmasına (ve belki de hata ayıklamasına) izin verir. Ayrıca, ikinci düşüncenizde verdiğiniz örnek biraz karmaşıklık katıyor, çünkü okuduğum her veri için bunları elde etmek için meta veri tablosunu sorgulamam gerekiyor. Verilerinizle meta verileriniz arasındaki ilişki 1: 1 veya 1: N ise, IMO açıkça işe yaramaz ve yalnızca karmaşıklık getirir (iyi bir YAGNI örneği).


Aradığım diğer bir avantaj , meta verileri bağımsız olarak kullanabilmektir , bu, içerikle ilgilenmeden sadece meta verileri sorgulamak anlamına gelir. İlişki verileri: 1: n meta verileri sizin görüşünüze göre “açıkça işe yaramaz”?
Sunyatasattva

Veri çözümü içindeki herhangi bir meta veriden yararsız kalan başka bir durum ekleyelim : Tek bir metnin, diğer kullanıcıların meta verilerini görebilecek (veya görmeyebilecek) farklı kullanıcılardan meta verilere sahip olmasını mümkün kılmak istiyorum .
Sunyatasattva

Yeni düzenlememde bu konu üzerinde biraz durdum.
Sunyatasattva

+1 SGML ve XML tam olarak bunun için tasarlanmıştır.
Ross Patterson

Bence bir sorun, bildiğim kadarıyla, XML'de başka bir şeyin içinde olan herhangi bir öğenin öğenin alt öğesi olarak kabul edilmesi ve etiketlerin çakışması mümkün değildir (yani, ebeveyni kapatmadan önce çocukları kapatmanız gerekir) ). Benim durumumda, iki nota kesinlikle örtüşebileceğinden böyle bir hiyerarşik yapı yoktur (cevabımın sonuna eklenmiş örnek).
Sunyatasattva

3

Çözüm Kullanım Örneği

Diğer bazı cevaplara katılmıyorum, çünkü harika çözümler olsa da, muhtemelen sizin çözümünüz değillerdir . Evet XML kısaltmasında kelime işaretlemesine sahiptir, ancak muhtemelen durumunuz için ideal değildir. Çok karmaşıktır, meta verileri orijinal metinden ayrı tutmak için çok az yardım sunar. Esasen, her şeyi bir kilolu veri kümesi oluşturarak bir meta veri biçimine dönüştürecektir.

Muhtemelen kesinlikle doğru bir çözüm ya da yaklaşım olmadığından, en iyi çözüm şu soruya cevap verir:

Veriler sistem tarafından nasıl kullanılacak?

Ayrıca, bir çözüm tasarımının doğal olarak sistemin değerine nasıl kullanılacağını nasıl ekleyebileceğini sorarsanız, o zaman zarif cevabınızı bulmaya daha yakın olursunuz .

Sorunu anlama

Tamam yeterli yorum, hadi soruna bakalım. Anladığım kadarıyla bu sorun (açıkçası buna eklemek yararlı olacaktır):

  • Orijinal bir metin var
    • Bu orijinal metinle ilgili varsayımlar:
    • Bu metin, birkaç bağımsız belgeden oluşabilir veya olmayabilir
    • Bu metin, bir veya daha fazla kullanıcı tarafından düzenlenebilir veya düzenlenmeyebilir
    • Bu metin, ilgili bilgileri içermektedir . Bu şekilde meta verilerin ilişkili olduğunu ve açıklayıcı olmadığını varsayarım (yanlışsam beni düzeltin) . Böylece, metni tanımlayan bilgileri değil, orijinal metinle ilgili bilgileri saklar. Orijinal metin hakkında notlar saklamak ve örnek metin olduğunu tarif olmaz Yani olan bir başlık olan cesur ve olan bir web sitesi vb bir bağlantı
    • Metin, meta verilerden farklı olarak kolayca filtrelenmelidir
    • Metin meta veriler tarafından bozulmaktan ve meta verilerden bozulmaktan korunmalıdır
  • Orijinal metinle ilgili bilgileri depolamanın bir yolu olmalıdır (meta veri)
    • Bu meta veriler ayrıca meta verilerin hangi kullanıcı (veya gruplar?) İle ilgili olduğu gibi meta verilerin açıklaması, hava durumu bir not veya yorum olduğunu söyleme gibi bilgileri içeren kendi (meta) meta verilerine ihtiyaç duyar veya açıklama vb.
    • Bu meta veriler (ve (meta) meta verileri) orijinal metindeki değişikliklere, meta verilerindeki değişikliklere ve (meta) meta verilerindeki değişikliklere dayanmalıdır.
    • Meta veriler (+ Meta-Meta Veriler) iyi yapılandırılmalı ve kolayca sorgulanmalı ve dizine eklenmeli ve hatta diğer veri kümelerine ilişkisel bir şekilde birleştirilmelidir . Meta verilerin ilişkisel doğası sadece Sorgular ile sınırlı kalmamalı, aynı zamanda ilişkisel veri aktivitelerinin bir sonucu olarak meta verilerin güncellenmesini veya yazılmasını ve değiştirilmesini kolaylaştırmalıdır .
    • Meta verinin (+ Meta-Meta veri) değeri, onunla çok ilgili bir niteliktedir. Orijinal metne olan ilişkisini kaybettiği anda derhal üretken olur. Dolayısıyla, orijinal metne olan ilişkisinin bütünlüğü zorunlu bir tasarım zorunluluğudur.
  • Sorunun doğası ve nasıl kullanılacağı ile ilgili diğer varsayımlar şunlardır:
    • Eşzamanlı heterojen sistem erişimi. Diğer bir deyişle, yönetici (veya başka bir işlem) yapılandırılmış meta veriler üzerinde ilişkisel veri sorguları gerçekleştirirken kullanıcının metni görüntülemek ve meta verileri düzenlemek isteyebileceği anlamına gelir.
    • Sistemin birkaç kullanıcısı olacak
    • Sistem modern. Başka bir deyişle, depolama alanı, işlem hızı veya gerçek zamanlı zorunluluklar tarafından kısıtlanmamıştır. Bütünlük ve amaç odaklı işlevsellik, fiziksel bilgi işlem kaynağı sınırlamalarından daha yüksek bir önceliktir.
    • Sistemin kullanımının ve işlevselliğinin, sistem kullanıldıkça bir şekilde değişme veya değişme olasılığı düşüktür.

Çözüm tasarımının oluşturulması

Sorunu yukarıda özetlediğim gibi anlayarak, şimdi yukarıdaki sorunu çözmeyi amaçlayan olası çözümler ve yaklaşımlar önermeye başlayacağım.

Bileşenler

Bu yüzden, özel olarak oluşturulmuş bir kullanıcı erişim sistemi olması gerektiğini görecektim. Alakalı ve alakasız meta verileri orijinal metinden filtreleyecektir. Metinde meta verilerin düzenlenmesini ve görüntülenmesini kolaylaştıracaktır. Meta veriler ve orijinal metni arasındaki ilişkinin bütünlüğünü sağlayacaktır. Meta verileri yapılandırır ve ilişkisel bir veri sistemine bir veri kaynağı sunar. Büyük olasılıkla bir dizi başka amaca yönelik işlev sağlayacaktır.

yapı

Bu yüzden orijinal metinde, bu sağlamanın en iyi yolu meta veri bütünlüğünü korumak için önemlidir, çünkü meta tutmaktır inline orijinal metinle. Bu, orijinal verilerin bu bütünlüğü bozmadan güvenle düzenlenebilmesi avantajını sağlayacaktır.

Bu yaklaşımla ilgili endişeler, meta verilerin orijinal veriler tarafından bozulması veya tam tersi. Meta verilerin ve (meta) meta verilerinin sorgulara ve güncellemelere ve etkin erişime olanak verecek şekilde yeterli dizine eklenmesi ve yapılandırılması. Orijinal metinden meta verilerin kolay filtrelenmesi.

Bunu göz önünde bulundurarak, çözümün bir kısmının orijinal metin içinde ESCAPE CHARACTERS kullanma yaklaşımına dayanmasını öneririm . Bu, kendi İşaretleme Dilinizi tasarlamak veya XML veya HTML gibi mevcut bir İşaretleme Dili kullanmakla aynı şey değildir . Orijinal metinde sıfır veya sıfıra yakın şansı olan bir KAÇIŞ KARAKTERİ tasarlamak kolaydır .

Bu konuda size tavsiyem, orijinal verileri dikkatlice değerlendirmek ve depolandığı kod sayfasının doğasını belirlemek ve daha sonra ideal bir KARAKTER veya KARAKTER SIRASI aramak olacaktır.bu gerçekleşmesi olası veya imkansızdır. Örneğin ASCII'de, standart kullanıcı arabirimlerinde hiç kullanılmayan bayt değerlerine sahip, tam anlamıyla yerleşik kontrol karakterleri vardır. Yazı tipi tabanlı veya ilişkisel veri tabanlı bilgi sistemi için de aynı şey söylenebilir. İkili veri kodeklerine dikkat edin. Orijinal verinin niteliğine bağlı olarak, belki de kaçan verilere bakarak ve bütünlüğünün doğrulandığından, ya kaçan yapının basit bir incelemesiyle, bir kontrol sekansının keşfini onaylayan bir ayrıştırıcı oluşturmak değerli olabilir. veriler, hatta kaçan her veri dizisi için hesaplanan bir kontrol karakteri ekleyerek.

Kaçış Dizili Örnek Veriler

Bu bir adamın hikayesi. >>>> (#) Neden bir kadın hakkında bir erkek değil bu hikaye? (#) ( ) Userid :: 77367 ( ) Yöneticinin Yorumu ( ) DataID :: 234234234 >>>> Çayır biçmeye giden bir adam, bir çayır biçmeye gitti. Adam köpeğiyle gitti >>>> (#) Çayır biçmek için hikayenin bir kedi ile daha iyi olup olmadığını sor (#) >>>>. Şimdi bu bir çayır biçmeye giden bir adamın ve köpeğinin hikayesi.

Bir adam ve köpeği, çayır biçmeye gitti, çayır biçmeye gitti, dağın üzerinden bir çayır ulaştı. >>>> (#) Bir ormanla çok daha iyi geliyor (**) Öneri Notu (#) >>>>

Adam ve köpeği ve misyonu, bir çayır biçmek için, dağın üzerinden ulaşan bir çayır sadece nehri geçerken ulaşılır.

Kaçış Dizisi Olmayan Örnek Veriler

Bu bir adamın hikayesi. Çayır biçmeye giden bir adam, çayır biçmeye gitti. Adam köpeğini çayır biçmeye gitti. Şimdi bu bir çayır biçmeye giden bir adamın ve köpeğinin hikayesi.

Bir adam ve köpeği, çayır biçmeye gitti, çayır biçmeye gitti, dağın üzerinden bir çayır ulaştı.

Adam ve köpeği ve misyonu, bir çayır biçmek için, dağın üzerinden ulaşan bir çayır sadece nehri geçerken ulaşılır.

Açıkçası bu kolayca ayrıştırılır, tüm Biçimlendirme dili olarak karmaşık değildir ve amacınıza kolayca uyarlanabilir.

Henüz Çözüldü mü? Hayır derdim. Çözümümüzün hala bazı delikleri var. Bu verilerin dizine eklenmesi ve yapılandırılmış erişimi zayıf. Ayrıca, bu dosyayı (veya birkaç dosyayı) düzenlemekle aynı anda sorgulamak mantıklı olmaz.

Bu sorunu nasıl çözebiliriz?

Belge başlığı olarak bir VERİ TAHSİS TABLOSU öneririm . Ayrıca bir İŞLEM TABLOSU GÜNCELLEME KUYRU'nun uygulanmasını öneririm . Açıklamama izin ver. Bir dosya sisteminin tasarımcıları, özellikle de bir döner disk dosya sistemi, yukarıda tarif ettiklerinizle benzer tasarım zorluklarıyla karşı karşıya kaldı. Verilerle birlikte diskteki dosyalar hakkında bilgi yerleştirmeleri gerekiyordu. Bu verilerin ilişki bütünlüğüne mükemmel bir çözüm , bir Dosya Ayırma Tablosunda (FAT) DUPLICATE idi .

Bu, her bir Meta Veri Öğesi için Veri Ayırma Tablosunda karşılık gelen bir giriş olduğu anlamına gelir . Bu yüzden hızlı, yapılandırılmış ve ilişkisel ve orijinal verilerden bağımsızdır. Meta verilerde sorguların, birleştirmelerin veya güncellemelerin yapılması gerekiyorsa, veri ayırma tablosuna erişerek kolayca yapılabilir .

Açıkçası, orijinal satır içi meta verilerinin Veri Ayırma Tablosu verilerinin gerçek bir yansıması olmasına dikkat edilmelidir . İşte bir İşlem Tablosu Güncelleme Kuyruğu devreye girer. Meta verilerin her değişikliği, eklenmesi veya kaldırılması, verilerin kendisinde değil, kuyrukta yapılır. daha sonra kuyruk hem satır içi hem de tablo verilerinde tüm değişikliklerin yapılmasını veya hiçbir değişiklik yapılmamasını sağlar. Ayrıca eşzamansız güncellemelerin yapılmasına izin verir, örneğin, belirli bir kullanıcının tüm meta verileri kuyrukta bir sil komutu çalıştırılarak silinebilir. Satır içi meta veriler kilitliyse ve kullanımdaysa, sıra hem Tablo verilerinde hem de satır içi verilerinde yapabilene kadar herhangi bir değişiklik yapmaz.


1
Merhaba Stephen ve Programcılara hoş geldiniz! Cevabınızdaki coşkuyu takdir etsem de, alakasız yorumları kaldırmak zorunda kaldım. Cevapların daha kısa ve net olmasını ve mümkün olduğu kadar daha geniş bir kitleye daha erişilebilir olmasını tercih ediyoruz.
yannis

Her şeyden önce, cevaptaki coşkuyu sevdiğimi söylemeliyim, böyle iyi geribildirim duymak harikaydı. Cevabın kendisi için, etiketleri açmak ve kapatmak için aynı sözdizimine karşı olacağımı söylemeliyim; ve belki de, en son güncellememde yukarıda tarif ettiğim XML probleminden kaçınmak için, neyin açıldığını ve neyin etiketin içinde kapatıldığını belirtirdim; belki bu yüzden istiyorum: >>>>>(#1) Lorem ipsum (#1)>>>>>>. Ayrıca, intext yorumlarındaki yaklaşımınız belirli bir sabit konuma bağlanır gibi görünüyor, ofset hareket ettirilirse bu nasıl çalışır?
Sunyatasattva

Ayrıca, yorumu kesin bir nokta yerine bir ofset aralığına bağlama gerçeğine nasıl yaklaşırsınız ? Son fakat en az değil: veri ayırma tablosu ve işlem güncelleme kuyruğu şaşırtıcı kavramlar gibi görünüyor. Konular hakkında biraz araştırma yaptım, ancak bu mimarlık probleminde bu kavramları nasıl uygulayacağınız ve biraz daha ayrıntılı olarak ele alabilir misiniz?
Sunyatasattva

1

Bu, tüm seçeneklerinizin farklı ödünleşmelere sahip olması ve hangisinin sizin için önemli olduğuna bağlı olması açısından tipik bir mühendislik sorusudur. Maalesef, belirleme yapmak için yeterli bilgi vermediniz.

Ayrıca önemli bir anlamsal problemi de göz önünde bulundurmadınız. Orijinal metnin

Arkadaşım Bob bana beş dolar ödünç verdi

Birisi "Bob" ifadesine bir yorum ekliyor

Bob tam bir salak

Ardından orijinal metin şu şekilde düzenlenir:

Jane Bob'a beş dolar ödünç verdi.

Sen belki böyle bir fark dosyasını göstermek için hangi gibi bir metin eşleştirme algoritması kullanarak bu özel durumda bazı mantıklı, ama karakter uzaklıklar meta "Jane" in "Jan" eklemek yapacağız.

Daha kötüsü, metin şu şekilde düzenlenmişse

Arkadaşım Steve bana beş dolar ödünç verdi

Meta verileri "Steve" e nasıl ekleyeceğinizi anlayabilirsiniz ancak geçerli olup olmadığını nasıl anlarsınız?

Ayrıca, meta verilerin kendisinde meta veri olup olmayacağına karar verdiniz mi? Bu, uygulamanızı değiştirebilir.

Anlamsal sorunların ötesinde, verilerle ne yaptığınız çok açık değil. Orijinal metnin herhangi bir biçimlendirme ile "kirlenmiş" olmasının belki de çok sakıncalı olduğunu düşündüm, ama sonra içinde ID değerleri olan bir şekilde Tamam oldunuz. Meta veriler metinde bir noktaya yerleştirilmek yerine metnin bir bölümüne uygulanırsa bu çok mantıklı değildir .

Tahminimce, çoğu zaman işaretli metinleri depolamak daha kolay ya da ikinci seçenek, tüm SQL'e gitmek ve metin ve işaretlemeyi bir düğüm hiyerarşisi ile temsil etmek - temelde tablo formunda bir DOM. Verileriniz hiyerarşikse, kendi verilerinizi yazmak yerine XML kullanmak ve mevcut ayrıştırıcıları ücretsiz almak daha kolay olabilir.

Kesin durumunuz için yeterince iyi olan oldukça basit bir çözüm olması oldukça mümkündür, ancak bunun ne olduğunu söyleyemem, çünkü bu gerçekten ne yapmaya çalıştığınıza ayrıntılı olarak bağlıdır.

Uygulamanızın çoğunun birçok SQL sorgusu tarafından görülebilir olması gerekiyorsa, bunu yapmak oldukça zor olsa da, seçtiğiniz stratejiyi olabildiğince kapsüllemenizi şiddetle tavsiye ederim.

Maalesef cevap çok dağınık ve "duruma bağlı" ile dolu, ancak gerçek dünya tasarım soruları böyle.


Anlıyorum ve kesin, doğru bir cevap aramıyorum. Ancak uygulama fikirleri, ödünleşmelerin analizi için, ya da belki diğerlerinden daha iyi bir cevap olduğunu düşündüm ve sadece bunu düşünmüyordum. Sorduğunuz soruyu cevaplamak için: hayır, benim durumumda meta verilerin kendisinde herhangi bir meta veri olmayacaktır.
Sunyatasattva

Daha iyi olan ne yapmaya çalıştığınıza bağlıdır.
psr

Size net bir resim vermek için sorumdan başka hangi ayrıntıların eksik olduğunu düşünüyorsunuz?
Sunyatasattva

Makul bir şekilde açıklayabileceğinizden daha fazlası. Bir metnin bir bölümü hakkında bir ekleme noktasıyla ilgili meta veriler olması ne kadar önemlidir, metni DB'deki bir alanda bir arada tutmak ne kadar önemlidir, her biri ne sıklıkta düzenlenir, sorgular düz SQL'de analiz ne kadar olacak? metin daha sonra analiz ve her biri ile rahatlık düzeyiniz nedir, bu hangi ölçekte gerçekleşir, zaman içinde değişmesi muhtemeldir, işaretleme ile giderseniz kendi basit ayrıştırıcıyı yazmakta rahat mısınız veya XML ile daha iyisini yapar mısınız? daha az özelleştirilmiş ancak daha fazla araç var ...
psr

Bu yüzden sadece rehberlik sunabiliyorum. Özellikle cevap, sadece siz değil, benzer durumlarda başkalarına da yardım etmek içindir.
psr

0

Sanırım önceki cevaplayıcının önerisi, sorunuzda bahsettiğiniz soru) çok iyi.

StackExchange sitelerine bağlantı gönderdiğimiz gibi davranır, ancak bilgi verileri başka bir tabloda olur. Avantajlar, verilerin ayrılması ve dolayısıyla sorgulanabilir ve dizine eklenebilir olmasıdır. Metni düzenlerken, silinmiş meta veri kimliklerini kontrol edebilir ve meta veri tablosunu temizleyebilirsiniz.

Söylediğiniz tek küçük sorun ayrıştırmadır, ancak bununla kolayca başa çıkabilirsiniz.


Önceki cevap nedir? Sunulan cevapların sırasının herhangi bir sırada olması garanti edilmez - ya da bu nedenle, yanıtınızı daha az kullanışlı hale getirmek için kökten değiştirilebilir veya silinebilir. Sorunuzu başka bir cevaba referansta bulunmayacak şekilde değiştirebilir misiniz?

Yani, soruda OP'nin bir önceki cevabı
RMalke

0

Bir metnim olduğunu varsayalım:

Lorem ipsum dolor sit amet, consipetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Notu şöyle ekliyorum:

Lorem ipsum dolor sit amet, consipetuer adipiscing elit, sed diam [@ 123, # 456,2w] nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

[@123,#456,2w]şu anlama gelir: user_id = 123, note_id = 456 ve bu notla işaretlenen metin sonraki 2 kelimeye yayılır (chars ( c), cümleler ( s), paragraps ( p) ya da her neyse). Kesin sözdizimi elbette farklı olabilir.

Düz metin editörlerinde notların metni tıpkı Markdown dipnotlarında olduğu gibi belgenin sonunda kolayca saklanabilir.

Zengin metin editörlerinde bu tür bir not metinde bir simge olarak görüntülenebilir ve işaretli metin bir şekilde vurgulanabilir. Kullanıcı daha sonra bu tür notları Delveya ile normal karakterler gibi silebilir Backspaceve bir tür özel düzenleme moduyla düzenleyebilir. İşaretli alanları bir fare ile yeniden boyutlandırmayı ve not metnini açılır pencereyle düzenlemeyi hayal ediyorum.

Artıları:

  • Her bir not için bir ofseti (örtük olarak metnin konumu ile) ve uzunluğu işaretlediğiniz için "kesişme noktaları" ile iyi gider.
  • Çok kullanıcılı ortamı destekler. (Aslında, bunun daha derin bir araştırmaya ihtiyacı vardır ve muhtemelen beynimin işleyemeyeceği Google Wave operasyonel dönüşümleri gibi bir şeyle uğraşmanız gerekir.)
  • Hem zengin hem de düz metin editörleri ile düzenlenebilir.
  • Tüm işaretçiler yerinde olduğundan revizyonları kolayca işleyebilirsiniz - metni bir işaretleyiciden önce düzenlediğinizde işaretçi diğer metinlerle birlikte kayar.
  • Ayrıştırması kolay.
  • Harici DB'ye gerek yok, ancak isterseniz bir tane kullanabilirsiniz.
  • Eğer göze batmayan bir sözdizimi seçerseniz Markdown veya XML ile karıştırılabilir.

Düz metin düzenleme için eksileri:

  • Metinde notlarla işaretlenmiş alanları (bir seçenek olan düz metni vurgulamadığınız sürece) değil, yalnızca notların başladığı yerleri göremezsiniz. Bu, keyfi uzunluk birimleri seçme yeteneği ile telafi edilir: karakter, kelime, cümle, paragraf.
  • Notun altındaki metni, özellikle de bir not oldukça uzunsa (örneğin 2+ paragraf) fark etmeden düzenleyebilirsiniz. Her notun altındaki bir metni önceki sürümüyle karşılaştıran ve değiştirilmişse kullanıcıya bildiren revizyon kontrol mekanizması ile telafi edilebilir.

Genel eksileri:

  • Birden çok kullanıcının aynı metni düzenlemesiyle ilgili sorunlar var, ancak yine de kaçınılmaz olduğunu düşünüyorum. Bu alanda uzman değilim.

Sizce bir kapatma etiketi eklemenin değil, ofsetlerle çalışmanın yanlısı nedir? Çok riskli değil mi? Ne arasına bir sözcük eklerseniz nonummyve nibhbu benim uzaklıklar ile, pisliği olmaz?
Sunyatasattva

Evet, bu bir ofsetle uğraşabilir ve bu sorun, tam olarak başlangıç ​​işaretçisi gibi davranan "sanal" not sonu işaretçisi ile zengin bir metin düzenleyicide çözülebilir, ancak açıkça düzenlenemez ( notun sonu, düzenlenen metinle birlikte kaydırılır) ve metinle birlikte kaydedilmez. Sadece düzenleme sırasında yerleştirirsiniz ve daha sonra kaydederken düşürürsünüz. Genel olarak, hem başlangıç ​​hem de bitiş işaretleyicilerinde sadece bir tanesiyle daha fazla sorun olabileceğini düşünüyorum, ama tabii ki yanlış olabilirim.
scriptin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.