Что является лучшим проектированием баз данных: больше таблиц или больше столбцов? [закрытый]

Мне нравится Copyconstructors:

    public AnyObject(AnyObject anyObject)
    {
        foreach (var property in typeof(AnyObject).GetProperties())
        {
            property.SetValue(this, property.GetValue(anyObject));
        }
        foreach (var field in typeof(AnyObject).GetFields())
        {
            field.SetValue(this, field.GetValue(anyObject));
        }
    }

Если у вас есть что-то, что можно скопировать, добавьте их

71
задан raven 1 March 2009 в 01:10
поделиться

15 ответов

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

  1. нормализация Пользы. Денормализация является формой оптимизации со всеми необходимыми компромиссами, и как таковой, к этому нужно приблизиться с отношение YAGNI .
  2. Удостоверяются, что клиентский код, ссылающийся на базу данных, разъединяется достаточно из схемы, что переделка его не требует главной модернизации клиента (клиентов).
  3. не боятся денормализовать, когда это предоставляет ясное преимущество для сложности запроса или производительности.
  4. представления Использования или нисходящие таблицы для реализации денормализации вместо того, чтобы денормализовать ядро схемы, , когда объем данных и сценарии использования допускают его .

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

56
ответ дан Chris Ammerman 24 November 2019 в 13:05
поделиться

Я думаю, что необходимо посмотреть на вид данных, которые Вы храните, прежде чем Вы примете то решение. Наличие таблицы адреса является большим, но только если вероятность нескольких человек, совместно использующих тот же адрес, высока. Если у каждого человека были различные адреса, сохранение тех данных в различной таблице просто представляет ненужные соединения.

я не вижу преимущества наличия городской таблицы, если города в себя не являются объектами, Вы заботитесь о в Вашем приложении. Или если Вы хотите ограничить количество городов, доступных Вашим пользователям.

Нижняя строка является решениями как это, должны взять само приложение в рассмотрение, прежде чем Вы начнете стрелять для эффективности. IMO.

0
ответ дан Tundey 24 November 2019 в 13:05
поделиться

Существуют огромные преимущества для запросы использование как можно меньше столбцов. Но сама таблица может иметь большое количество. Jeff говорит что-то относительно этого также.

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

0
ответ дан ColinYounger 24 November 2019 в 13:05
поделиться

Хм.

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

Однако когда Вы получены это работа, смотрят в оба на производительности. Если Вы вращали объект, который требует, чтобы Вы сделали большие, дорогие соединения, возможно, это становится лучшим проектным решением вращать ту таблицу назад в оригинал.

1
ответ дан John Christensen 24 November 2019 в 13:05
поделиться

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

1
ответ дан kemiller2002 24 November 2019 в 13:05
поделиться

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

, Когда система разрабатывается, Вы могли бы рассмотреть 'ненормализацию' некоторой части, если Вы рассматриваете что как улучшение.

1
ответ дан zappan 24 November 2019 в 13:05
поделиться

Я думаю, что баланс в порядке в этом случае. Если имеет смысл помещать столбец в таблицу, то помещенный это в таблицу, если это не делает, то не делает. Ваш подход коллег определенно помог бы нормализовать базу данных, но это не могло бы быть очень полезно, если необходимо присоединиться к 50 таблицам вместе для получения информации, Вам нужно.

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

1
ответ дан Craig H 24 November 2019 в 13:05
поделиться

Как все остальное: это зависит.

нет никакого жесткого правила относительно количества столбцов по сравнению с количеством таблицы.

, Если у Ваших клиентов должно быть несколько адресов, то отдельная таблица для этого имеет смысл. Если у Вас есть действительно серьезное основание нормализовать столбец City в его собственную таблицу, то это может пойти также, но я не видел, что прежде, потому что это (обычно) - поле свободной формы.

таблица А тяжелый, нормализованный дизайн эффективен с точки зрения пространства и выглядит "хорошим для учебника", но может стать чрезвычайно сложным. Это выглядит хорошим, пока Вы не должны делать 12 соединений для получения имени и адреса клиента. Эти проекты не автоматически фантастические с точки зрения производительности, которая имеет значение больше всего: запросы.

Избегают сложности, если это возможно. Например, если у клиента может быть только два адреса (не произвольно многие), то могло бы иметь смысл просто сохранять их всех в единственной таблице (CustomerID, Имя, ShipToAddress, BillingAddress, ShipToCity, BillingCity, и т.д.).

Вот сообщение Jeff по теме.

3
ответ дан Michael Haren 24 November 2019 в 13:05
поделиться

База данных мультитаблицы намного более гибка, если какая-либо из этих связей "один к одному" может стать той многим или многим многим в будущем. Например, если необходимо сохранить несколько адресов для некоторых клиентов, намного легче, если у Вас есть потребительская таблица и таблица адреса. Я не могу действительно видеть ситуацию, где Вы, возможно, должны были бы копировать некоторые части адреса, но не других, так отдельный адрес, город, состояние, и таблицы zip могут быть немного чрезмерными.

3
ответ дан Chris Upchurch 24 November 2019 в 13:05
поделиться

Каждая таблица должна только включать столбцы, которые принадлежат объекту, это однозначно определяется первичным ключом. Если бы все столбцы в базе данных являются всеми атрибутами того же объекта, то Вам только была бы нужна одна таблица со всеми столбцами.

, Если бы какой-либо из столбцов может быть пустым, тем не менее, необходимо было бы поместить каждый nullable столбец в его собственную таблицу с внешним ключом к основной таблице для нормализации его. Это - общий сценарий, таким образом, для более чистого дизайна, Вы, вероятно, будете добавлять больше таблиц, чем столбцы к существующим таблицам. Кроме того, путем добавления этих дополнительных атрибутов к их собственной таблице они больше не должны были бы позволять, аннулирует, и Вы избегаете убивания СВЯЗАННЫХ С ПУСТЫМ УКАЗАТЕЛЕМ проблем.

4
ответ дан Mark Cidade 24 November 2019 в 13:05
поделиться

Это зависит от Вашей разновидности базы данных. SQL Server MS, например, имеет тенденцию предпочитать более узкие таблицы. Это - также более 'нормализованный' подход. Другие механизмы могли бы предпочесть его наоборот. Мэйнфреймы имеют тенденцию падать в той категории.

5
ответ дан raven 24 November 2019 в 13:05
поделиться

Полностью нормализованный дизайн (т.е., "Больше Таблиц") более гибок, легче поддержать и избегает дублирования данных, что означает, что Ваша целостность данных будет намного легче осуществить.

Те - мощные причины нормализовать. Я принял бы решение нормализовать сначала, и затем только, чтобы денормализовать конкретный таблицы после , Вы видели, что производительность становилась проблемой.

Мой опыт состоит в том, что в реальном мире, Вы не достигнете точки, где денормализация необходима, даже с очень большими наборами данных.

5
ответ дан JosephStyons 24 November 2019 в 13:05
поделиться

Я спорил бы в пользу большего количества таблиц, но только до определенного момента. Используя Ваш пример, если Вы разделили информацию своего пользователя на две таблицы, говорят, что ПОЛЬЗОВАТЕЛИ и АДРЕС, это дает Вам гибкость для имения нескольких адресов на пользователя. Одно очевидное приложение этого является пользователем, у которого есть отдельные адреса выставления счета и адреса поставки.

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

11
ответ дан Bill the Lizard 24 November 2019 в 13:05
поделиться

Это так не походит на вопрос о таблицах/столбцы, но о нормализации. В некоторых ситуациях имеют высокую степень , нормализация ("больше таблиц" в этом случае) является хорошей, и чистой, но она обычно берет высокое количество СОЕДИНЕНИЙ для получения релевантных результатов. И с достаточно большим набором данных, это может сорвать производительность.

Jeff записал немного об этом относительно дизайна StackOverflow. См. также сообщение, ссылки Jeff на Отваживаются Obasanjo.

11
ответ дан izstas 24 November 2019 в 13:05
поделиться

Существуют преимущества для наличия таблиц с меньшим количеством столбцов, но также необходимо посмотреть сценарий выше и ответить на эти вопросы:

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

2
ответ дан Dillie-O 24 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

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