2016-12-05 20 views
0

Я пытаюсь разработать схему mysql для адресной книги. Неопределенность, которую я имею, заключается в том, как ее моделировать, потому что некоторые контакты будут иметь один номер телефона и один адрес электронной почты, тогда как другие могут иметь кратные значения. В интерфейсе я создам кнопку, которая позволяет пользователям добавлять поля адреса.Адресная книга базы данных Адрес

Сейчас моя модель выглядит следующим образом:

class Person(models.Model): 
    sex = models.CharField(max_length=32) 
    first_names = models.CharField(max_length=64) 
    last_names = models.CharField(max_length=64) 
    date_of_birth = models.DateField() 
    marital_status = models.CharField(max_length=64) 
    nationality = models.CharField(max_length=64) 

    address_street = models.CharField(max_length=64) 
    address_alt_line = models.CharField(max_length=64) 
    address_zip = models.CharField(max_length=64) 
    address_state = models.CharField(max_length=64) 
    address_city = models.CharField(max_length=64) 
    address_country = models.CharField(max_length=64) 
    phone1 = models.CharField(max_length=64) 
    phone2 = models.CharField(max_length=64) 
    phone3 = models.CharField(max_length=64) 
    phone4 = models.CharField(max_length=64) 
    phone5 = models.CharField(max_length=64) 
    email1 = models.CharField(max_length=64) 
    email2 = models.CharField(max_length=64) 
    email3 = models.CharField(max_length=64) 
    email4 = models.CharField(max_length=64) 
    email5 = models.CharField(max_length=64) 
    website1 = models.CharField(max_length=64) 
    website2 = models.CharField(max_length=64) 
    website3 = models.CharField(max_length=64) 
    website4 = models.CharField(max_length=64) 
    website5 = models.CharField(max_length=64) 
    website6 = models.CharField(max_length=64) 
    website7 = models.CharField(max_length=64) 
    website8 = models.CharField(max_length=64) 
    website9 = models.CharField(max_length=64) 

Однако я знаю, что это не очень DRY. Другой вариант я думал, чтобы создать отдельные модели для людей и отдельных из них для адреса, сообщения электронной почты, номера телефонов, веб-сайты и т.д., а затем сделать person.id внешнего ключа для этих моделей:

class Person(models.Model): 
    sex = models.CharField(max_length=32) 
    first_names = models.CharField(max_length=64) 
    last_names = models.CharField(max_length=64) 
    date_of_birth = models.DateField() 
    marital_status = models.CharField(max_length=64) 
    nationality = models.CharField(max_length=64) 


class Address(models.Model): 
    street = models.CharField(max_length=64) 
    alt_line = models.CharField(max_length=64) 
    zip = models.CharField(max_length=64) 
    state = models.CharField(max_length=64) 
    city = models.CharField(max_length=64) 
    country = models.CharField(max_length=64) 
    type = models.CharField(max_length=64) 
    owner = models.ForeignKey(Person, on_delete=models.CASCADE) 


class Phone(models.Model): 
    number = models.CharField(max_length=64) 
    type = models.CharField(max_length=32) 
    owner = models.ForeignKey(Person, on_delete=models.CASCADE) 


class OnlineContact(models.Model): 
    address = models.CharField(max_length=64) 
    type = models.CharField(max_length=32) 
    owner = models.ForeignKey(Person, on_delete=models.CASCADE) 

какие-либо из этих подходов хорошо (достаточно) или есть лучший способ сделать это? Я бы предпочел не использовать NOSQL db и придерживаться MySQL. FYI Я использую Python и Django.

класс Person (models.Model):

+1

2-й подход (со многими моделями) - это именно то, как оно должно быть в реляционном db (например, mysql) – CrowbarKZ

ответ

0

я не думаю, что СУХОЙ относится к проектированию модели, если вы не используете ту же модель и заменить его пару раз

, если разделить его на 2 модели, например : пользователей, users_details поэтому логично разделить AUTH данные и персональные данные , но в вашем случае для большого разделения на таблице

почему вам нужно так много таблиц для телефона, веб-сайт, электронная почта может быть, вы дизайн данных ISN» t correct

+0

. Разделение было только примером, потому что я не знаю, как обрабатывать неопределенное количество полей (например, Phone1, Phone2, Phone3 и т. Д.) В одной модели. –

+0

, если у вас будет неизвестное количество полей определенного типа, так что сделайте его другой моделью с ForiegnKey –

+0

, если вам не нужно выполнять поиск по этим данным, и вы Ok с извлечением его с помощью других полей. Вы можете использовать данные JSON для хранения множителей –