Farklı tablolardan çeşitli nesneleri temsil eden bir normalize form var mı?

1 Cevap php

Şu anda inşa ediyorum bir sistem için, aşağıdaki iki senaryo oluşur:

  1. , Izinler herhangi bir düzeyde herhangi bir varlığa uygulanabilir, ve 4 "Katlı" vardır, 3 ile 0 numaralı Gibi: Benim izinleri sistemi kullanıcılara rolleri ve rollerine izinler bağlama eskimeyen favori, ama bir farkla. Rol atama tablo 5 alan uzun: ". özürlü" varlık katmanlı, varlık kimliği, rol kimliği, kullanıcı kimliği, ve bir bayrak Bu "Tier / ID" sistemi de bir "Ev Varlık" kullanıcıları atama kullanılır.

    Bu sistemin talihsiz yan etkisi yerine SQL içinde uygulamanın kendisi benim bu varlık başvuruları, çözmek için genellikle çok basit olduğunu (ben bunu yapmak mümkün olacağını biliyorum, ancak bazı ciddi çirkin sorgularda neden olacaktır) . Is there a better way to represent this sort of relationship? Is this an acceptable way of representing this relationship?

    Yan Not: Tek bir varlık aşağı tuş kez çok yani varlıkların kendileri için masalar (bunlar hiyerarşik olarak), yabancı anahtar başvuruları (örneğin, Tier 3 Tier 2, vb hakkında bilgi içerir) ebeveyn çocuğa işaret ile normalize, çocuklarını ve atalarını bulmak için basit.

  2. Benzer bir sorun, ancak farklı veri içeriği: en düşük kademedeki cihazlar "bağlı." Olabilir Cihazlar da (bir harita gibi) bir grafik gösterimi üzerine yerleştirilmek üzere izin verilir, ve düzenleme bilgileri veritabanında saklanır. (Aynı zamanda "puan" olarak adlandırılır) grafiksel referanslar gerçek bir cihazda işaret etmelidir, ama gerçek bir cihaz grafiksel referans işaret olmayabilir.

    Şu anda, kendi ekran düzeni, konumu, büyüklüğü, vb ben buradan yapmak için üç olası şeyler belirleyebilir için bilgi (aygıtları temsil) bütün "puan" için tek bir referans tablo var:

    1. Bireysel cihazların temsil normalleştirilmiş bir dizi tablo oluşturmak ve onları aramak için benzer bir "cihaz türü / cihaz ID" sistemi kullanmak ve "puan" tablosunda bu bilgileri saklamak; bu hala kendi tablolarda gerçek cihazlara bu başvuruları çözümünde aracılık işi yapmak için uygulanmasını gerektirir
    2. Normalleştirilmiş bir dizi tablo oluşturun ve "puan" masada onları işaret; Bu çözüm muhtemelen noktaları veri KQUEUE uygulama gerekmez, ancak tüm cihaz tablolar herhangi bir Tier 3 nesne için taranacak gerektirecektir.
    3. Bir kılavuz olarak puan tablosu kullanılarak, her ilgili normalize tabloya ilgili ekran tüm verileri ekleyin. Bu hiç bir aramalarını çözmek zorunda önlemek isterken, yine de ben her cihaz tablo tarama gerektirir ve aynı zamanda veri noktaları diğer çözümlerle karşılaştırıldığında saklanmalıdır nasıl herhangi bir değişiklik son derece hoşgörüsüz olacaktır.

    Is this problem already solved and I just didn't get the memo? Is there a standard design addressing this problem, or should I just assume that I will have to resolve these references myself?

Not: Sorunun iki ile ilgili olarak, ben korkunç olmak üzere aşağıdaki iki çözüm sayılır ve ben (ben değil oldukça eminim en iyi yolu olduğunu biraz çılgın, inanılmaz kanıt engelleme) bunları dikkate almayacağım:

  1. Puan tablosunda kendisi (tefrika dizi ya da böyle bir mekanizma olarak), her cihazla ilgili tüm bilgileri saklamak. This has the obvious problem of being completely unsearchable and defying normal form
  2. Bir tek, genel tablodaki tüm cihazları saklayın. Unfortunately, these devices are all extremely different in the type of data they provide, as well as how they must be accessed, and doing so in one table would require, last time I tried working it out on paper, at least 30 (and probably more) columns, more than half of which would be null for every row.

Ben özellikle bu sorunu gidermek, mevcut desen ve / veya normalize şemalar arıyorum ama herhangi biri varsa çözümleri, talep ve takdir edilmektedir. Eğer doğru cevap olduğu bir gerçektir için biliyorum, "Hayır" yeterli olacak ve ben bu başvuruları gidermek için uygulama katmanı kullanmaya devam edecektir. Ben sadece birisi zaten bu / bu sorun (lar) çözmüştür zaman yanlış yönde bir yolunu buluyor değilim bilmek tercih, henüz bir sorun olmamıştır. Şimdiden teşekkürler.

EDIT: Permissions/Asset Schema

Tier 0 aslında ima ve veritabanında değil, ama bazı şeyler Tier 0 (Asset ID 0) olarak kayıtlı olduğu

Tier 1:

id int(5) unsigned not null primary key auto_increment,
name varchar(32) not null,
disabled tinyint(1) unsigned not null,

Tier 2:

id int(5) unsigned not null primary key auto_increment,
parentId int(5) unsigned not null,
name varchar(32) not null,
abbr varchar(16) not null,
disabled tinyint(1) unsigned not null,
foreign key (parentId) references tier1(id)

Aşama 3:

id int(5) unsigned not null primary key auto_increment,
parentId int(5) unsigned not null,
name varchar(32) not null,
abbr varchar(16) not null,
disabled tinyint(1) unsigned not null,
foreign key (parentId) references tier2(id)

İzinler:

id int(5) unsigned not null primary key auto_increment,
permission_key varchar(16) not null,
permission_desc varchar(128) not null

Rolleri:

id int(5) unsigned not null primary key auto_increment,
name varchar(32) not null,
tier1_id int(5) unsigned not null,
disabled tinyint(1) unsigned not null,
foreign key (tier1_id) references tier1(id)

Role_İzinler:

role_id int(5) unsigned not null,
permission_id int(5) unsigned not null,
disabled tinyint(1) unsigned not null,
primary key (role_id, permission_id),
foreign key (role_id) references roles(id),
foreign key (permission_id) references permissions(id)

User_Role_İzinler:

tier_id tinyint(1) unsigned not null,
asset_id int(5) unsigned not null,
user_id int(5) unsigned not null,
role_id int(5) unsigned not null,
disabled tinyint(1) unsigned not null,
primary key (tier_id, asset_id, user_id, role_id),
foreign key (user_id) references users(id),
foreign key (role_id) references roles(id)

1 Cevap

Eğer örnek tier_1_assets ve tier_1_permissions için her nesne ayrı bir tabloya uygulamak tablolar, ve tier_2_assets ve tier_2_permissions bir dizi halinde izinleri tablo kesiliyor kabul var. Bu basit varlıkların bir katman için izinlerini sorgulamak için yapmak, ancak bir kullanıcının tüm izinler için sorgulamak için daha karmaşık (bu bir ticaret kapalı) olacaktır.

Ben de bir ilişkisel veritabanı veri için doğru depolama ortamı olduğu varsayımını meydan olacaktır. Gerçekten de olabilir, ama aynı zamanda olmayabilir. (PHP bu açıdan özgürlüğünü sınırlayabilir).

Veri seti küçük ise, neden tek bir dizgeleştirilmiş dosyaya kaydedebilir, ve bellekte tutar ve bir sorgu arayüzü sağlayan küçük bir sunucu yok? Ben iyi nedenleri olmayan vardır eminim. (PHP olmanın yanı sıra)

Eğer ikinci sorun için birden fazla nokta tablolarını düşündünüz mü? Bu bir tekrarı gibi hissedebilirsiniz, ama (sen tablolar zaman onlara yabancı anahtar kontrolleri kullanmak için almak bakmak ups bazı türleri için hayatı kolaylaştırmak ve nesnenin farklı bir türü olarak her yabancı anahtar başvuru dikkate zaman normalleştirilmiş yok ) ayrıldı.

Nesneler arasındaki ilişkilerin çokluğu nerede tuşları ve referanslar koymak söylemek gerekir: -> tek-çok (anahtar <- yabancı anahtar); çok-çok -> (anahtar <- link-table -> anahtar); Bir-opsiyonel -> (

Ben belirtildiği gibi sorunu neticesinde herhangi bir desen bilmiyorum. Ama en genel çözümleri başka bir tablo çok hızlı bir şekilde yönetmek gerçekten zor almak yaratmaktan kaçınmak için fark etmişsinizdir.