Gelişmiş Veritabanı Tasarım - aşağıdaki yürütmek için nedir en etkili yolu

4 Cevap php

I am good with ideas, but due to my limited programming experience I sometimes strain to come up with the most effective solution for a given concept. Currently my mind is trying to fathom the most efficient way to reference a database table specific to a data type.

Concept

Ben sağlayan bir yönetici arayüzü inşa ediyorum 'yapı' seçilen içerik 'konteyner' dayanan bir içerik kümesi için site sahibi. Arabirimi şu anda vb int, varchar, metin gibi çeşitli sql veri tipleri, tutar ve kullanıcı veri türünü seçmek için izin verir, etiket, ve sonra bir grup halinde bunları birbirine bağlamak.

Bu grup daha sonra veri setinin bir örneği olarak başvurulan ve yeniden kullanılabilir. Örneğin, konteynırların 'title' ve 'beden' basit bir sayfa oluşturmak için kullanılan olabilir ve bu grubun her yeni örneği yeni bir sayfa olabilir.

Issue

The issue I am having is in referencing these containers in the most efficient manner possible. I can't simply have a table with an instance id and a container id, because there is no way to know they type of container. For example, the content-varchar table has an id field and then a value field in the format of varchar. The content-text table has an id field and then a value field in the format of text.

I thought about making one large table that held each possible type of data, but this would be a gross waste of space. Currently I use a sub query to select the specific value from the relating table once I know the data type, but there has to be a better solution.

Fikirleriniz / önerileriniz nelerdir?

4 Cevap

Ben bir şey eksik sürece, bu korkunç karmaşık gelmiyor. Bir ilişkisel veritabanı içinde bir ilişkisel veritabanı koyuyorduk gibi ama o does ses. Bu genellikle şeyleri gitmek için yanlış bir yoldur.

Eğer ısrar eğer Yine, burada yapmak için birkaç gözlem var:

  • Bir ContentSet bir veya daha fazla ContentItems tanımlar.
  • Bir ContentItem birkaç iyi tanımlanmış ilkel türlerinden biridir, ContentTypes olabilir.

Eğer dört tablolar olurdu gibi Yani, sesler:

  • content_sets: ContentSets ve bu yüzden her birini, setleri başlığı ve oluşturulan kullanıcı olarak ilişkili meta.
  • content_items, ContentItems, bir dış anahtar ile birlikte ContentSet da aittir.
  • content_types, her ContentItem saklanabilir olası türlerinin bir listesi. Sizin uygulama her öğenin depolanan verilerin doğru olup olmadığını zorlar.
  • content_groups: ContentSets örnekleri, gerçekleştirilen veri ve bir yabancı anahtar içeren ContentSet onlar bir örneğidir. Verileri kendini saklamak için bir özellik torba / leke / metin alanını kullanın.

Eğer boşa düşük düzeyde şeyleri yapıyoruz.

Sen ilişkisel veritabanını sert şekilde yeniden icat ediyoruz. Bir ilişkisel veritabanı içinde.

Etkili gibi güçlü ilişkisel veri yazdığınız her veri parça yönetemez.

Bir seçim (birbirine bağlı birden şeylerle bireysel değil dizeleri, ama kompozit kayıtları) üst düzey yapıları kullanmaktır.

Diğer seçenek, sadece metin kullanmaktır. Bu basittir. HTML tarayıcıya geri gönderilir Sonunda, tüm metin olur.


"... Vb int, varchar, metin gibi çeşitli sql veri türleri ve kullanıcı etiket, ve sonra bir grup halinde bunları birbirine bağlamak, veri türünü seçmek için izin verir."

Basit türler == satır grubu. - De - onlara bir programcı yapıyoruz kullanıcı serbestçe veritipinin bir koleksiyon dayalı bir tablo tanımlamak için izin veriliyor. Eğer masa tasarımı için bir ön uç yaratıyoruz.

BTW, araçlar sürü zaten sizin için bunu yapmak. RoR ve Django akla geliyor: Eğer bir veritabanı ve satır alıp bir sayfa ile maç nasıl gösterir sayfa ve görünümü fonksiyonu üzerinde bu öğeleri konumlandırmak için bir şablon satırı tanımlamak.

Veya

Alan etiket ve grup etiket ile basit tek metin alanları etiketleyin. Çok daha basit. Sadece iki tuşları ile metin. Sen "grup" getir ve şablonu doldurmak için etiket / değer çiftlerini kullanabilirsiniz. Django bu kodun bir satır, satır getirmek bir sözlüğe bunları açmak ve bir şablona geçmek olduğunu.

İşte MySQL manual METİN ve BLOB alanları hakkında söylenecek ne var:

Çoğu bakımdan, size istediğiniz kadar büyük olabilir bir VARBINARY sütun olarak bir BLOB sütun kabul edebilirsiniz. Benzer şekilde, bir VARCHAR sütun olarak bir TEXT sütunu kabul edebilir.

Çeviri: Tüm METİN veya BLOB sütun kullanarak alanı israf olmaz. MySQL o (VARCHARS gibi) kullanmak değil ne keser.

Burada uygulama, bu tür bir örnek. Ben ilişkisel veritabanı niyet yıkarak hakkında çok fazla endişe olmaz - sürece size yeterince iyi bir neden var gibi. Her neyse, bu uygulama tek bir tablo ile gitti - ve metadata ve ihtiyaç duyulan tip verilerin gerçek zamanlı dönüşüm dayanıyordu.

Kullanıcıların kendilerini yönetecek bir ticari ürünün bağlamında özellikleri bir kullanıcı genişletilebilir kümesini desteklemesi gerekiyordu. Atılan alternatifler, onların veritabanı (çok pahalı) değiştirmek için bir DBA ödemek zorunda (çok fazla başarısızlık modları) gerçek tablo üreten ve (- raporlama, vb app çoğu ilişkisel veritabanı gerekli) olmayan bir ilişkisel veritabanı kullanılarak dahil.

Bu uygulamada müşteri genişletilebilir veri kullanıcı tarafından sağlanan meta tuşları ve onların değer kısıtlamaları açıklanan hangi modeli içinde genişletilebilir tablolar, bağlı anahtar-değer çiftleri olarak modellenmiştir. Her iki öznitelik VARCHARS edildi. Ben vb ikili görüntülerini, soundfiles işlemek sanmıyorum vb tamsayılar, yüzen, karakterler: Bu (on yıl önce) o anda ihtiyaç her tür veri tutunabileceği

Vs türü, aralık, durumda, değeri bilinmeyen, belirli değerleri için Bildirime kısıtlamalar kullanıcı tarafından sağlanan meta verileri okumak tetiklenmiş bir saklı yordam tarafından ele alındı. Uygun türe dönüştürme uygulaması ya da meta verileri okumak bir UDF (hangi hatırlayamıyorum) ya tarafından ele alındı.

Çözüm hızlı değildi, ama çok esnek, güvenilir ve kullanımı kolay oldu.