Php kullanarak mysql üzerinde normalleşmesini nasıl uygulanır

5 Cevap php

Ben herhangi bir fikrim yok lütfen. Ben konuyla ilgili bazı okumalar yaptık rağmen. Bütün bildiğim bu veritabanındaki verilerin daha verimli ve kolay hale getirmek için kullanılır olmasıdır. Ve Ayrıca disk alanı kaydetmek için kullanılabilir. Ve son olarak, normalleştirme kullandıysanız. Siz daha fazla tablo üretmek zorunda kalacaktır.

Now I have a lot of questions to ask. First, how will normalization help to save disk space or whatever space occupied by the database. Second, Is it possible to add data on multiple tables using only 1 query. Please help, I'm just a newbie wanting to learn from you. Thanks.

5 Cevap

Tamam, şey çift:

  1. php bu ile ilgisi var. normalleştirme model verileri ile ilgilidir
  2. normalleştirme disk alanı tasarrufu ile ilgili değildir. Bu da veri bütünlüğünü korumak için bir yol olan, kolayca bakımı olduğunu böylece verileri düzenleyerek ilgili.
  3. normalleştirme tipik olarak birkaç aşamada ya da 'normal biçimlerde' de tarif edilmektedir. Uygulamada, ilişkisel veritabanı tasarımı insanlar genellikle sezgisel çoğu zaman 'doğru olsun'. Ama normal formlar haberdar olmak için hala iyi olduğunu ve bunların özellikleri nelerdir. Orada bu konuda birçok belge internet (fe http://en.wikipedia.org/wiki/Database_normalization) üzerinde olduğunu ve kesinlikle bir araştırma kendi yapmalıyım, ama en önemli aşamaları şunlardır:

unormalized veriler: Bu aşamada, veri ('ilişkisel') gerçekten tablo değildir. Orada gerçekten ne anlama tabular bir sürü tartışma ve uzmanlar birbirleriyle katılmıyorum. ama çoğu insan çok değerli özellikler (bir satır için bir değer olarak listeleri içerebilir = sütun) vardır veri durumunda normalleşmemiş olduğunu kabul, ya da durumda aynı depolamak için (= birden fazla sütun veya sütun birden fazla grup gruplar var tekrarlıyor veri tipi)

Example of multi-valued column: person (first_name, last_name, phonenumbers) Here, phonenumbers implies there could be more phonenumbers, stored in one column

Example of repeating group: person(first_name, last_name, child1_first_name, child1_birth_date, child2_first_name, child2_birth_date..., childN_first_name, childN_birth_date) Here, the person table has a number of column pairs (child_first_name, child_birth_date) to store the person's children.

Fatura ve nakliye için adresleri verilerin benzer parçaları olabilir, ancak her ikisi de sadece bir düzenin farklı bir yönünü temsil eden bir düzen için kendi ayrı rolü vardır: düzeni (shipping_address, billing_address) gibi bir şey, bir yinelenen grup olmadığını unutmayın. child1 aracılığıyla child10 yapamam - (Eğer önceden rezerve gerektiğini kaç grup asla bilemezsiniz) çocukların belirli roller yok, ve çocukların listesi değişkendir

Her iki durumda da, sütunlar çok değerli ve yinelenen gruplara, temelde "iç içe geçmiş tablo" bir yapıya sahip - bir tablo içinde bir tablo. Veri bunların hiçbiri ortaya çıkarsa 1nf (birinci normal form) olduğu söyleniyor.

1NF yapısal characeristics hakkında: verilerin tablo biçimidir. Tüm subsequenct normal formlar fazlalığını ortadan kaldırarak ile yapmak zorundayız. Aynı bilgi, bağımsız bir şekilde, birden çok kez depolandığı zaman Fazlalık oluşur. Fazlalık kötü: Bazı gerçeği değiştirmek istiyorsanız, birden fazla yerde değiştirmek zorunda. Eğer şans onlardan biri unutursanız, tutarsız veri var - veri kendisini çelişiyor.

Her 6NF kadar 1nf kadar daha yüksek bir normal forma, tüm yol açan, fazlalık ortadan kaldırabilir süreçlerin bir yeri vardır. Ancak, normalde en veritabanları yeterince 3NF (ya da denilen boyce-Codd normal formda, BCNF bir lsight varyasyon) Siz 2NF ve 3NF çalışmalıyım normalize, ancak prensibi çok basittir: bir tablo varsa, yeterince normalleştirilmiş:

  1. Tablo 1NF olduğu
  2. tablo bir anahtar vardır (ki gerekli olan değerler sütun veya sütun birleşimi ve hangi benzersiz bir satır tanımlar -. yani anahtar sütunlardaki değerlerin bu kombinasyonuna sahip tek bir satır olabilir)
  3. anahtar olmayan sütunları arasında fonksiyonel bağımlılıkları vardır
  4. anahtar olmayan sütunlar, anahtarın bir parçası üzerine işlevsel olarak bağlı değildir (ancak tüm anahtar üzerine tamamen işlevsel olarak bağlıdır).

fonksiyonel bağımlılık, bir sütunun değeri başka bir sütundan elde edilebilir anlamına gelir. Basit bir örnek:

order_item (order_id, ITEM_NUMBER, customer_id, product_code, product_description, tutar)

Kullanıcının (ITEM_NUMBER order_id) varsayalım anahtarıdır. product_code ve ürün tanımı birbirine bağlı işlevsel bağımlıdır: (ürün tanımı product_code bir fonksiyonu olduğu gibi) belirli bir product_code için, her zaman aynı ürün açıklamasını bulabilirsiniz. Sorun şimdi: Bir particualr ürün kodu için bir ürün tanımı değişiklikleri varsayalım, o product_code bize tüm siparişleri değiştirmek zorunda. tek ve tutarsız bir veritabanı var unutma.

Bunu çözmek için yol tuşu olarak (product_code) sahip olan, (product_code, product_description) ile yeni bir ürün tablo oluşturmak için, ve sonra yerine sırayla tüm ürün alanları saklamak, yalnızca içinde çarpım tablosundan bir satır bir referans olarak saklamak order_item kayıtları (bu durumda, order_item sadece çarpım tablosunda bir satır yukarı bakmak yeterlidir, hangi product_code tutmak ve product_description bulmak gerekir)

U görebilirsiniz sizin kadar, bu çözüm ile aslında (ürün sipariş olur her order_item tüm bu ürün açıklamaları depolayarak tarafından değil) yerden tasarruf yapmak ve daha fazla tablo olsun (order_item gelen ürün kopmuş) Ama hatırlıyor musun çünkü Diskspace tasarruf değil: daha kolay verileri korumak için yapım, böylece fazlalık ortadan kaldırmak çünkü öyle. şimdi sadece açıklamasını değiştirmek için ürün tablodaki bir satır değiştirmek zorunda çünkü

StackOverflow benzer bir çok soru vardır zaten, örneğin, Can someone please give an example of 1NF, 2NF and 3NF in plain english?

Bunlardan bir grup için sağa Related kenar çubuğunuzda bak. Yani başlamak gerekir.

Lütfen özel sorular gelince:

I think you will learn this when you start creating the schema for your database.
Please think reverse when you add a field that exists somewhere else in your database.

By reverse I mean, ask yourself: if I have to modify the field, how many queries do I have to run? Probably you end up, with the answer, that you will have to run 2 or X times the query to modify the content of your column. Keep it simple, that means assign an ID to each content you have duplicated in your database.

Örnek alarak kolon için address

Bu iyi değil

update clients set address = 'new address' where clientid=500;
update orders set address = 'new address' where orderid=300;

iyi bir yaklaşım olacaktır

create a addresses table
//and run a single query
update addresses set address = 'new address' where addressid=100;

Ve bir yabancı anahtar referans (istemciler + siparişleri), sen id 100 değiştirilmez ki başarmak, bu yolu olarak veritabanı tablosundaki her yerde adres id 100 kullanımı, ancak adresin içeriğini güncellemek, tüm bağlantılı tablolar almak olacaktır değiştirin.

Normalleşme Seviye 3 sizin için bu kez yeterli.

Normalization kurallar kümesidir. Daha sen, veritabanı olan normalleşme daha yüksek bir "seviye" izleyin. Genel olarak, 3. seviye aranan yüksek seviyedir.

Normalize veriler olmayan normalleştirilmiş verilerine göre teorik olarak "saf" olduğunu. Bu daha kolay konuda rasyonalize için yapar, ve senkronize çıkıyorum veri şansını azaltır olan fazlalık kaldırır.

Ancak bir pratik açısından bakıldığında, normalleştirilmiş veri teoride olsa bile, her zaman iyi bir tasarım değildir. Eğer gerçekten ince noktalarını bilmiyorsanız, normalize veriler hedefleyen olsa böyle kötü bir fikir değildir.

To question 2: No it is not possible to insert data into multiple tables with one query.
See the INSERT syntax.

Diğer cevaplar ek olarak, aynı zamanda normalleşmesi için burada SO arama ve örneğin bulabilirsiniz soru: Normalization in MySQL