2009-10-26 17 views
14

Piszę aplikację internetową dla mojej firmy inżynierskiej (ostrzeżenie: jestem programistą tylko przez hobby) i planowałem używać Django, dopóki nie trafię w ten szkopuł. Modele, z których chcę korzystać w sposób naturalny, mają klucze podstawowe z wieloma kolumnami. Na http://code.djangoproject.com/ticket/373, nie mogę używać Django, a przynajmniej nie jest to wydana wersja. Czy ktoś może mi pomóc w obejściu problemu, czy to za pośrednictwem innej struktury internetowej (tylko w oparciu o Python), czy też sugerując zmiany w modelu, aby działał z ograniczeniami Django? Naprawdę mam nadzieję na to ostatnie, ponieważ miałem nadzieję, że wykorzystam to jako okazję do nauki Django.Django lub podobne dla kompozytowych kluczy podstawowych

Przykład: Pierwsza tabela zawiera numer części i numer_ części jako dwa pola, które powinny zawierać klucz podstawowy. P/N może istnieć w wielu wersjach, ale P/N + rev są unikalne.

Tabela numer 2 zawiera numer części, numer artykułu i numer wymiaru jako jego klucz podstawowy. P/N na konkretnym rev może mieć wiele wymiarów, jednak każdy jest unikalny. Również w tym przypadku, P/N + rev powinno być ForeignKey z Tabeli pierwszej.

Odpowiedz

19

Obejście problemu polega na utworzeniu zastępczego klucza (kolumny automatycznej inkrementacji) jako kolumny klucza głównego i umieszczeniu unikalnego indeksu na kluczu złożonym domeny.

Klucze obce będą wówczas odnosić się do zastępczej kolumny klucza podstawowego.

+1

+ 1 - beat mnie do niego. –

23

Dlaczego nie dodać zwykłego klucza głównego, a następnie określić, że part_number i part_revision jako unique_together?

To zasadniczo jest Djangoish (Djangonic?) Sposób robienia tego, co powiedział Mitch Wheat.

+0

Wow! to jest rzeczywiście najlepsze rozwiązanie! –

+1

Djangonic zgodnie z Pythonic :) – ajay

14

Sugeruję użycie klucza zastępczego. Nie dlatego, że jest to "Djangoosque". Załóżmy, że używasz klucza złożonego, który zawiera numer części. Co się stanie, jeśli jakiś czas później Twoja firma zdecyduje się zmienić format (a więc wartości) tego pola? Czy ogólnie rzecz biorąc, jakiekolwiek pole? Nie chcesz zajmować się zmianą kluczy podstawowych. Nie znam żadnej korzyści z użycia klucza złożonego, który składa się z "prawdziwych" wartości, ale uważam, że nie jest to warte kłopotów. Używaj bezsensownych, automatycznie edytowanych kluczy (i prawdopodobnie powinno to uczynić klucz złożony bezużytecznym).

+4

To powinno być dużo modowane. Dobry artykuł na temat tego, dlaczego surogaty są lepszym pomysłem, to: http://www.agiledata.org/essays/keys.html – cethegeek

+0

Głównym problemem związanym z branżą oprogramowania jest to, że każdy próbuje rozwiązać dany problem na większą skalę. Co się stanie, jeśli spróbuję zastosować Django do predefiniowanego zestawu danych, którego struktura może być zmieniona lub nie? Ważniejsze jest to, że jest to jeden z przypadków użycia samego Django: "ramy dla perfekcjonistów z terminami". –

2

SQLAlchemy obsługuje kluczowe klucze podstawowe i obce, więc każda struktura oparta na SQLAlchemy (Pylons i Werkzeug) powinna zaspokoić Twoje potrzeby. Ale zastępczy klucz podstawowy jest łatwiejszy w obsłudze i lepiej obsługiwany.

0

jeśli chcesz tylko unikalne mieszane pola:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField() 
    key2 = models.IntegerField() 

Ale jeśli chcesz wyjątkowy razem i jeden z kolumny być podstawowym Spróbuj podobne poniżej kodu:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField(primary_key=True) 
    key2 = models.IntegerField() 
Powiązane problemy