Я пытаюсь разработать схему 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):
2-й подход (со многими моделями) - это именно то, как оно должно быть в реляционном db (например, mysql) – CrowbarKZ