Çalışan kimliği ikilemi vs Şirket

7 Cevap php

Benim SQL veritabanında iki tablo var:

Şirket:

  • ID (değiştirmemesi)
  • isim
  • adres
  • ...

Çalışanlar:

  • ID (değiştirmemesi)
  • Company_id
  • internal_id
  • isim
  • lastisim

Sorun company, ait oldukları göreli bir çalışan kimliği (internal_id) olmasını istiyorum olmasıdır. Ben gerçekten bunu uygulamak için temiz yolu ne olurdu arıyor değilim çünkü ben bu Dilema aldım.

Bir seçenek sadece çalışanlar company_id = X SELECT MAX (internal_id) bir tür yapmak olacaktır, ama sorun ben son çalışan silmek gerçekleşmesi halinde bir sonraki sonrakinin kimliği ile oluşturulmuş olacağını olacaktır.

Herhangi bir fikir veya öneriniz?

PD: The reason of why I want to do this is that i dont want a user from company X create an employee that is for example ID=2000, while the last employee created in his company was, say, 1532. this would normally happen in a system in wich Company Y and Z also create employees on the same system. I want this ID not to use as a foreign_key, but to have it for internal (even documents or reports) use.

PD2: In this case the employees will never have to change companies

7 Cevap

Birincil anahtarlar ilgisiz "İş" kimliklerini veya numaralarını oluşturma hakkında burada birçok soru vardır.

Yeni bir çalışan oluştururken sizin durumunuzda Sonra Şirket masa "NextEmployeeID" konulu bir sütun yaratacak sadece değerini almak ve bunu artırmak.

Şimdi çalışan şirketleri değiştirirse ne olur anlamaya size bırakıyorum. :-)

Hayır, bunu yapma! Bu propblem değildir ve, aslında, doğru tasarlanmış bir şeyi çözmek için (diğer şeyler arasında eşzamanlılık sorunları hakkında endişelenmenize gerek) veritabanındaki birçok birçok sorunlar yaratacaktır. Id anlamsız olmalı ve boşluklar önemsizdir. Sen employeeid / şirket kimliği birleşimi benzersiz bir dizin hiçbir çalışanın birden fazla şirketlere atanan sağlamak isterim.

Sizin çalışan id değiştirilmesi gereken hiç bir şey olmalıdır. Eğer aptal şirket çeşit tabanlı kimlik ve şirketi A şirketi B dışarı alıyor ve şirket C hale yaparsanız, tüm kimlikleri ve tüm ilgili tabloları değiştirmek zorunda sona. Mevcut tasarım yalnızca şirket kodu değil, ilgili tablolar güncellemeniz gerekir.

Ayrı bir tablo oluşturun:

CREATE TABLE t_identity (company INT NOT NULL PRIMARY KEY, id INT NOT NULL)

ve sorunu:

INSERT
INTO    t_identity (@company, 1)
ON DUPLICATE KEY UPDATE
SET     id = id + 1

yeni bir çalışanı takmadan önce.

Neden internal_ids için GUID'lerini kullanmak değil mi? Bu şekilde, her zaman sadece kimliği çarpışmalar korkusu olmadan ekler yapabilirsiniz.

Eğer mevcut yapısı verilen silme anomaliyi önlemek mümkün olmayacaktır, ama sen gerçekten bunu zaten önerdiğiniz şekilde yapmamalısınız. Güvenilir almak için "bir sonraki sayı," Sen kilit tablo ve kötü her türlü neden olur olacaktır. Belki de onlar gitmek ve yine bazen gelmek eğilimi gibi tür yumuşak çalışanları için silebilirsiniz bazı uygulayabilirsiniz. :)

Bir FK olarak çalışan kimliği kullanmak için gidiyoruz eğer, gerçekten ve DB işlerinin tümünü silmek istersiniz? Çalışanın bir durumu alanını yapmak ve "A" yönerge ya da "ben" nactive ayarlayın. O yüzden sadece Autoincrement olsun tüm şirketler arasında benzersiz kalırsa ÇalışanKimliği en iyisidir. Kullanıcıların kimliklerini görmek asla izin, onları sadece isimlerini görelim.

Ayrıca sütunlar kimliği isim yok, şirket kimliği veya ÇalışanKimliği, arama için daha okunabilir ve daha kolay olacaktır.

Quassnoi önerdiği gibi ben şirket ve akımı max sıra numarası ile, ayrı bir tablo oluşturmak istiyorum. Ama bir girdi olarak şirketin kabul ettiği (MySQL UDF yapar?) Bir saklı yordam veya UDF bunu örtecek, akım değerini ve değer artırılır döner artırır.

Bir ilişkisel veritabanı bir satır silmek asla. Sen (IE, Set Employee.ActiveFlag = 0) o çalışanın sona gerekir

Yani bir internal_id (int) vardı ve yaptım eğer bir o iyi çalışır (company_id = [parameterCompanyID] Çalışan MAX (internal_Id) 1 SEÇ).