Karmaşık verilere erişirken / bunları düzenlerken, birçok küçük parçada veya büyük bir yığın halinde saklamak daha mı iyi?


11

Gitar sekmeleri: Oldukça karmaşık verileri işleyen bir web uygulaması geliştiriyorum.

    As a reference, guitar tabs look like this:
Eb|-------------------------------------------------------------------------|
Bb|-------------------------------------------------------------------------|
Gb|--5-5-5-5----------------------------------------------------------------|
Db|--5-5-5-5--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Ab|--3-3-3-3--3-3-3-3--7-7-7-7--5-5-5-5--2-2-2-2--3-3-3-3--2-2-2-2--5-5-5-5-|
Eb|-----------1-1-1-1--5-5-5-5--3-3-3-3--0-0-0-0--1-1-1-1--0-0-0-0--3-3-3-3-|

Performansın bu verileri büyük bir yığın olarak saklaması veya parçalayıp "notla" temelinde saklaması daha verimli olur mu?

As a use case:
User changes first chord from:       to:
                         Eb|---   Eb|---
                         Bb|---   Bb|---
                         Gb|--5   Gb|--4
                         Db|--5   Db|--4
                         Ab|--3   Ab|--2
                         Eb|---   Eb|---

Bir blok olarak saklarsam, sekmeleri işlemek için kodun çok daha karmaşık olması gerekir. Notu notla saklarsam, veritabanına çok daha fazla erişilmesi gerekir. Hangi yöntem daha verimli? Potansiyel olarak, birçok kullanıcı verileri değiştirecektir. En iyi performans gösteren web uygulamasını istiyorum . Bu, cevabı hiç etkiliyorsa MySQL kullanacağım.


2
Ne için daha iyi? Yerden mi tasarruf ediyorsunuz? CPU gücü? IO? Başka bir şey?
Oded

Bu bir web uygulaması. Birçok kullanıcı potansiyel olarak verileri oldukça sık değiştirecektir. Bahsettiğiniz gibi birçok faktörün bunu farklı şekilde etkilediğini hayal ediyorum. Bu özelliklere pek aşina değilim; kısmen bu yüzden burada soruyorum.
Gabe Willard

Ne için optimizasyon yaptığınızı bilmiyorsanız, nasıl cevap verebiliriz? Şey - önce oluşturun, belirli sorunlarınız varsa, bunları nasıl çözeceğinizi sorun.
Oded

12
Veritabanlarını oluşturmadan önce tasarlamıyor musunuz? Benim sorum bir veritabanı tasarlamak. Sorun gidermek için değil. Henüz hata ayıklama aşamasında değilim ve ben olsam bile, bu Programcılar değil StackOverflow giderdi. SSS uyarınca: Programcılar algoritma ve veri yapısı kavramlarını, tasarım modellerini, yazılım mimarisini, yazılım mühendisliğini kapsar ... Darboğazlarda sorun gidermez.
Gabe Willard

+1 çok ilginç bir sorun ve iyi iş illüstrasyon yararlı bir kullanım örneği. Bana bir gitar sekmesi uygulaması geliştirmek için iyi bir bahane olsaydı.
Evan Plaice

Yanıtlar:


8

Operasyon sayısı her iki şekilde de aynı olacaktır. Bir şarkının tüm akorlarını almak için bir sorgu yaparsınız, ardından her değişiklik yapıldığında bir güncelleme yaparsınız. Fark gerçekten güncellemelerin boyutunda. Block yöntemi ile, bir akoru her değiştirdiğinizde şarkının tamamını kaydetmeniz gerekir . Tek tek yöntemle, güncellemeleriniz daha küçük ve muhtemelen daha verimli olacaktır, ancak fark göz ardı edilebilir.

Dikkate alınması gereken başka bir şey de not-not yöntemi daha normalleştirilmiş, yani kullanırsanız yolda daha fazla sorgu seçeneğiniz olacak. Örneğin, yeni başlayanlar öğrenmek için bir şarkı ararken bilmedikleri akorları filtreleyebilir veya birisi bir şarkının adını bilmiyorsa açılış akorlarına göre aramaya izin verebilirsiniz. Bu özellikleri şimdi planlamasanız bile, daha sonra böyle bir şey istiyorsanız veritabanınızı değiştirmek büyük bir acı olacaktır.


5

Genel olarak, daha normalleştirme birkaç nedenden dolayı iyidir:

  1. Verilerin daha az çoğaltılması, daha küçük bir fiziksel veritabanı boyutuna yol açar.
  2. Daha iyi veri bütünlüğü - belirli gereksinimleri uygulamak için yabancı anahtarları kullanabilirsiniz.
  3. Tanımladığınız daha basit güncelleme kodu.
  4. Veri alt kümelerine daha fazla dizinlenebilir erişim yolu.

Dezavantajlar ( burada iyi açıklanmıştır ) şunları içerir:

  1. Normalizasyon yerden tasarruf sağlar, ancak alan ucuzdur.
  2. Normalleştirme güncellemeleri basitleştirir, ancak okumalar daha yaygındır.
  3. Performans daha az normalleştirilmiş şemalarda genellikle daha iyidir.

Daha normal bir tasarımla başlamayı öneririm ve sadece performans sorunlarıyla karşılaşırsanız normalleştirmeyi düşünürüm.


Gitar sekmeleri veritabanı ile basitlik, tutarlılık ve bütünlük performansı düşürür. Bu yüzden gelebileceğim en basit normalleştirilmiş şema ile giderdim.
9000

2

Depolama alanınızı çalışmak için en kolay ve sıkıştırmak için yeterince zor hale getirin. Oldukça normalleştirilmiş bir şema ile gidin. Mümkünse ilk sürümünüzde gerekenden farklı kullanımları engellemeyen bir şema ile gidin.

Eğer tüm ihtiyacınız Belirli bir şarkı için sekmeler göstermektir, bir doküman olarak bir şekilde almayı (MongoDB gibi) belge odaklı DB 6-dizilerini çok depolayabilir.

Bir RDBMS, ben benzer şekilde, böyle bir tabloda depolamak istiyorum:

table tab_column (
  song_id integer not null foreign key references song(id),
  ordinal integer not null, -- position in the tabulature
  s1 number(2), -- position on 1st string
  ...
  s6 number(2),
  primary key(song_id, ordinal)
)

RDBMS'ler, bir şarkıyı göstermek için gereken gibi basit sorgularda iyidir:

select * from tab_column
where song_id = :song_id
order by ordinal;

Kullanılması limitve offset, bir şarkının parçalarını gösterebilir.

Daha sonra tab_columnbir akor tanıyabilirseniz, akorları listeleyen bir tabloya bağlanmak kolay olacaktır .

Bu muhtemelen mümkün olan en basit şemadır; Onunla başlardım.

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.