дизайн базы данных большая таблица против разделенной таблицы имеют одинаковое - PullRequest
0 голосов
/ 22 января 2012

У меня есть программа базы данных для магазина, так как вы знаете, что в ней слишком много счетов-фактур: одна для того, что я купил, а другая для меня, когда я их продал, две таблицы почти идентичны, как

счетИдентификатор таблицы customerName дата invoiceType

и invoiceDetails с идентификатором invoiceId цена товара

Мой вопрос прост, как лучше сохранить такой дизайн или разделить каждую таблицу на две отдельные таблицы?Друг предлагает разделить таблицы как одну для saleInvoice, а другую для buyInvoice, чтобы ускорить время запроса. Каковы плюсы и минусы каждой абрукции? Я чувствую, что, если я делю их, это как если бы я не следовал правилу СУХОГО, я использую Nhibernate BTW, поэтому егоКак-то странно иметь одинаковый класс с разными именами

Ответы [ 2 ]

1 голос
/ 24 января 2012

Я бы спросил себя, как я собираюсь использовать эту информацию?Будут ли мне нужны продажи и счета на покупку по тем же запросам?Могу ли я в конечном итоге нуждаться в специализированной информации для каждого типа?И если я это сделаю, нужно ли мне иметь дочерние таблицы только для 1 типа?Как это повлияет на ссылочную целостность?Будет ли изменение одного автоматически означать, что мне нужно изменение другого?Насколько большой может быть таблица (она должна быть в миллионах, прежде чем я решу, что ее нужно разделить только из-за размера).Какова вероятность того, что я получу информацию случайно, если они будут в одной таблице и включат оба, когда я этого не хотел?Ответы будут определять, нужно ли мне разделить это для меня.Я склонен рассматривать их как две отдельные функции, и потребуется много времени, чтобы убедить меня поместить их в одну таблицу.

1 голос
/ 23 января 2012

Оба подошли бы работать.Если вы используете подход с одной таблицей, то столбец invoiceType будет вашим полем дискриминатора.В вашем отображении nHibernate это поле дискриминатора будет использоваться nHibernate, чтобы решить, какой тип (например, покупка или продажа) создать экземпляр для данной строки в таблице (см. Раздел 5.1.6 руководства по отображению nHibernate . Для специальных SQL-запросов или запросов отчетов вы можете создать два представления: одно для возврата только строк с invoiceType = purchase, а другое - только для строк, в которых invoiceType = sales.

В качестве альтернативы можно создать два отдельныхТаблицы, одна для покупки и одна для продажи. Как вы указали, эти две таблицы будут иметь почти идентичные схемы и файлы отображения nhibernate.

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

Я бы предпочел иметь одну таблицу со столбцом дискриминатора, чтобы лучше следовать принципам СУХОЙ.Если бы у меня не было четких чисел, указывающих на то, что это необходимо, я бы откладывал реализацию секционированной таблицы до тех пор, пока это не станет необходимым.

...