Действительно ли это - хороший способ смоделировать адресную информацию в реляционной базе данных?

Вы можете перебрать атрибут __bases__ объекта класса, чтобы вызвать метод __init__ каждого из родительских классов:

class C(A, B):
    def __init__(self):
        print("Started C's constructor")
        for base in self.__class__.__bases__:
            base.__init__(self)
        print("Ended C's constructor")

, чтобы C() выдает:

[ 111]
26
задан WW. 21 November 2008 в 00:31
поделиться

7 ответов

Я на самом деле использую это в качестве одного из моих вопросов об интервью. Следующее является хорошим местом для запуска:

Addresses
---------
AddressId (PK)
Street1
... (etc)

и

AddressTypes
------------
AddressTypeId
AddressTypeName

и

UserAddresses (substitute "Company", "Account", whatever for Users)
-------------
UserId
AddressTypeId
AddressId

Таким образом, Ваши адреса полностью не знают, как они используются, и Ваши объекты (Пользователи, Учетные записи) ничего непосредственно не знают об адресах также. Это - все до связывающих таблиц, которые Вы создаете (UserAddresses в этом случае, но можно сделать любые соответствия модель).

Одна часть несколько противоречащего совета для потенциально большой базы данных: разрешение и помещенный "основной" адрес непосредственно на Ваши объекты (в таблице Users в этом случае) наряду с полем "HasMoreAddresses". Это кажется неприглядным по сравнению только с использованием чистого дизайна выше, но может упростить кодирование для типичных вариантов использования, и денормализация может иметь большое значение для производительности.

27
ответ дан 28 November 2019 в 07:33
поделиться

Опция 2, без сомнения.

Некоторые важные вещи иметь в виду: это - важный аспект дизайна для указания пользователям, когда адреса связаны друг с другом. Т.е. корпоративный адрес, совпадающий с адресом поставки; если они хотят изменить адрес поставки, они хотят изменить корпоративный адрес также, или они хотят определить новое прикрепление загрузки? Этот вид материала и способность подарить пользователям эту информацию и изменить вещи с этим видом гранулярности ОЧЕНЬ важны. Это важно также относительно обновлений; дайте пользователю гранулярность для "разделения" записей. Не то, чтобы этот вид UI легко разработать; фактически, это - сука. Но действительно важно сделать; что-либо меньше почти наверняка заставит Ваших пользователей очень расстраиваться и раздражаться.

Также; я настоятельно рекомендовал бы иметь в наличии старые адресные сведения; не выполняйте процесс для чистки его. Если у Вас не будет ОЧЕНЬ занятой базы данных, Ваше программное обеспечение базы данных будет в состоянии обработать избыточные данные. Действительно. Одна частая ошибка я занимаюсь базами данных, пытается сверхоптимизировать; Вы ДЕЙСТВИТЕЛЬНО хотите оптимизировать ад из своих запросов, но Вы не хотите оптимизировать свои неиспользованные данные. (Снова, если Ваше действие базы данных ОЧЕНЬ ВЫСОКО, Вы, возможно, должны иметь что-то, делает это, но это - почти уверенность, что Ваша база данных будет работать хорошо с тихим наличием избыточных данных вокруг в таблицах.) В большинстве ситуаций, на самом деле более выгодно просто позволить Вашей базе данных вырасти, чем это должно попытаться оптимизировать его. (Удаление спорадических данных из Ваших таблиц не вызовет значительное сокращение размера Вашей базы данных, и когда это... успеет, переиндексация, которую это вызывает, может быть гигантским дренажом на базе данных.)

6
ответ дан 28 November 2019 в 07:33
поделиться

Я думаю, что соглашаюсь с JohnFx..

Другая вещь о (улитка-) почтовые адреса, так как Вы хотите включать страну, которую я принимаю, Вы хотите поставить/отправить по почте на международном уровне, сохраните текст главным образом свободной формы поля адреса. Это - действительно раздражающая необходимость составить 5 почтовых индексов цифры, когда Норвегия не имеет индексов, у нас есть 4 постчисла цифры.

лучшие поля были бы:

  • Имя/Компания
  • Адрес (многострочная текстовая область)
  • Страна

Это должно быть довольно глобально, если американо-почтовая система требует индексов в определенном формате, то включает это также, но делает его дополнительным, если США не выбраны как страна. Все знают, как отформатировать адрес в их стране, поэтому, пока Вы сохраняете разрывы строки, которыми это должно быть хорошо...

2
ответ дан 28 November 2019 в 07:33
поделиться

Вы хотите вести хронологический учет того, какой адрес был первоначально на заказе на поставку?

, Если да идут с опцией 1, иначе сохраните ее в таблице поставщика и свяжите каждый заказ на поставку с поставщиком.

BTW: верный признак плохого дизайна DB является потребностью в автоматизированном задании для хранения данных "очищенными" или в синхронизации. Опция 2 вероятна плохая идея той мерой

1
ответ дан 28 November 2019 в 07:33
поделиться

Почему был бы какая-либо из строк на таблице адреса становиться неиспользованной? Конечно, на них все еще указал бы заказ на поставку, который использовал их?

мне кажется, что остановка дубликатов должна быть приоритетом, таким образом инвертировав потребность в любой очистке.

1
ответ дан 28 November 2019 в 07:33
поделиться

В случае заказов Вы никогда не хотели бы обновлять адрес как человек (или компания) адрес, измененный, если заказ был отправлен. Вы награда запись того, где заказ был на самом деле отправлен, если существует проблема с порядком.

таблица адреса является хорошей идеей. Сделайте ограничение на уникальность данных на него так, чтобы тот же объект не мог иметь дублирующихся адресов. Можно все еще получить их, поскольку пользователи могут добавить другой вместо того, чтобы искать их и если они запишут вещи немного по-другому (Св. вместо улицы), то ограничение на уникальность данных не предотвратит это. Скопируйте данные в то время, когда порядок создается к порядку. Это - один случай, где Вы хотите несколько записей, потому что Вам нужна хронологическая запись того, что Вы отправили где. Только разрешение вставляет и удаляет к таблице, не имеет никакого смысла мне, поскольку они не так более безопасны, чем обновления и включают больше работы для базы данных. Обновление сделано в одном вызове к базе данных. Если адрес изменяется в Вашей идее, то необходимо сначала удалить старый адрес и затем вставить новый. Не только больше вызовов к databse, но и дважды шансу создания ошибки в коде.

0
ответ дан 28 November 2019 в 07:33
поделиться

Я видел, что каждая система использовать опцию 1 входит в проблему качества данных. После 5 лет 30% всех адресов больше не будут текущими.

0
ответ дан 28 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: