Drupal veritabanına dizin eklemek güvenli midir?


12

Bu konuda arama yapıyordum ve okudum, ancak Drupal tablolarına (hem çekirdek hem de katkıda bulunan) dizinler ekleme konusunda kesin bir şey görmedim.

Temel kaygım, çekirdek veya katkıda bulunan kodu güncellediğinizde ve şema değişiklikleri olduğunda herhangi bir özel dizinle ne olacağıdır. Bu durumda ne olur?

DÜZENLE:

Bence bazı bağlamlar yardımcı olabilir. Öncelikle site performansını ayarlamak için tablolara dizin ekleme ile ilgileniyorum (yavaş sorgu günlüğünde görünen sorgular, yavaş görünümlere sahip sayfalar, vb.). Bu, başkasının modülündeki bir tabloya bir dizin eklenmesini içerebilir. Örneğin

  1. Modülü taktım foo
  2. Modül foo tablo oluşturur foo
  3. Tabloya bir dizin ekliyorum foo
  4. Modülün fooşemayı değiştiren bir güncellemesi var

Ne oluyor?

Yanıtlar:


7

Evet, sorunlara neden olabilir.

Bir modül, bir dizin eklediğiniz sütunda bir şey yapmak istiyorsa, kendi dizinlerini kaldıracak ve sonra yapmak istediği işlemi yapacak.

Tam olarak ne olacağı, veritabanı türünüze ve gerçekte yürütülen işleme bağlıdır. Örneğin, sütunun yeniden adlandırılması MySQL ile iyi çalışır, ancak PostgreSQL'de başarısız olur. Ancak bu sütunu silmeye çalışırsa (belki de verileri farklı bir tabloya / colun'a taşıdıktan sonra) başarısız olur.

Bunun gerçekleşme şansı, en azından küçük güncellemeler için nispeten düşüktür (ancak gerçek modüle bağlıdır. Genellikle küçük sürümlere bir şey kırabilecek herhangi bir değişiklik eklemem ), ancak mümkündür.

Benim önerim, modül koruyucularla birlikte çalışmaya çalışmanızdır. Sorunlu sorgu (lar) modülün kendisindeyse, bir yama sağlarsanız, koruyucular muhtemelen dizinleri mutlu bir şekilde ekleyecektir. Dizini eklemeden önce ve sonra sorunlu sorgunun / sorguların DESCRIBE çıktısını sağlayın. Ayrıca şemayı güncelleyen bir düzeltme eki sağlayın (mevcut yüklemeler için ayarlamak üzere bir güncelleme işlevi ekleyin).

Performansla ilgili şeyler üzerinde aktif olarak çalışan ve yukarıdakileri gerçekten iyi yapan biri, işte bir örnek: http://drupal.org/node/983950


2

DatabaseSchema_pgsql :: changeField ve db_change_field () içinde bildirildiği gibi :

ÖNEMLİ NOT: Veritabanı taşınabilirliğini korumak için, değiştirilen alanı kullanan tüm dizinleri ve birincil anahtarları açıkça yeniden oluşturmanız gerekir.

Bu, db_change_field () öğesini çağırmadan önce, etkilenen tüm anahtarları ve dizinleri db_drop_ {Primary_key, unique_key, index} () ile düşürmeniz gerektiği anlamına gelir. Anahtarları ve dizinleri yeniden oluşturmak için, anahtar tanımları isteğe bağlı $ new_keys bağımsız değişkeni olarak doğrudan db_change_field () öğesine iletin.

Örneğin, varsayalım:

$schema['foo'] = array(
  'fields' => array(
    'bar' => array('type' => 'int', 'not null' => TRUE)
  ),
  'primary key' => array('bar')
);

foo.bar yazın ve seriyi birincil anahtar olarak bırakın. Doğru sıra:

db_drop_primary_key($ret, 'foo');
db_change_field($ret, 'foo', 'bar', 'bar',
  array('type' => 'serial', 'not null' => TRUE),
  array('primary key' => array('bar'))
);

Benzer kod Drupal 7 için de bildirilmiştir.

Deneyimlerime göre, seri alan kullanan birincil anahtarı kaldıramayacağınızı unutmayın. Drupal 6'da bunu yapmaya çalıştığımda her zaman bir hata aldım; Bunu Drupal 7'de denemedim.

Bunun dışında, veritabanı dizinleri ile ilgili başka bir sorun bilmiyorum.

Başka bir modülden oluşturulan bir veritabanı tablosuna bir dizin ekleme hakkında, bunu yapmanızı tavsiye etmem, çünkü:

  • Modülün kendisi bu dizini oluşturmadıysa, bir modül değiştirilen bir alanın dizinini bırakmaz. Dizin adını bilmediği için modülün bunu yapması mümkün olmaz.
  • Modülün çekirdek bir modül olması durumunda bile, başka bir modül tarafından oluşturulan bir veritabanı tablosunu değiştirmek asla iyi bir fikir değildir. Aynı tabloyu değiştiren başka bir modül varsa, modüller birbirleriyle olan çatışmaları veya çekirdek modülün kendi veritabanına uygulayacağı değişikliklerle nasıl başa çıkabilir?

Veritabanı tablosu başka bir modülden (çekirdek modül veya üçüncü taraf modül) oluşturuluyorsa, modül için yeni bir dizin kullanmak için bir kullanım durumu sağlayarak bir özellik isteği açmanızı öneririm; herhangi bir performans sorunu varsa, dizin eklemek istediğiniz şey olabilir.

Başka bir modülden oluşturulan bir tabloya kendi sitenize bir dizin ekleyecekseniz, modül her güncellendiğinde ve kendi sitenize kurmadan önce özel modülünüzde yapmanız gereken değişikliklere hazırlıklı olun .
Ekstra çalışmanın elde ettiğiniz performansa değip değmeyeceğine siz karar verebilirsiniz. Şahsen, buna değdiğini sanmıyorum.


Teşekkürler. Yalnızca kendi modülümde bir değişiklikle değil, yavaş bir sorgu ile mücadele etmek için bir tabloya bir dizin eklersem bu nasıl çalışır? Bir şansım olduğunda sorumu biraz daha net olacak şekilde düzenlemeye çalışacağım.
mpdonadio

3
Ayrıca , hangi dizinlerin oluşturulacağını bilmek için kullanışlı olan DB Tuner'ı kullanmayı düşünebilirsiniz .
11'te tostinni

@tostinni Evet, soru neredeyse DB Tuner'ın önerilerini uygulamakla ilgiliydi.
mpdonadio
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.