Есть 2 отдельные таблицы или дополнительное поле в 1 таблице? - PullRequest
1 голос
/ 15 мая 2010

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

Акциями может быть продажа акций компании или покупка. Поэтому детали, которые будут сохранены в обоих случаях, будут:

  1. Количество акций
  2. Средняя цена

Было бы лучше использовать отдельные таблицы для «покупки» и «продажи» или просто использовать одну таблицу для «торговли» и оставить поле, которое отграничивает «покупать» от «продажи»?

Ответы [ 5 ]

3 голосов
/ 15 мая 2010

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

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

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

Например, согласно австралийскому законодательству, вы можете фактически компенсировать продажу своей последней покупкой, если у вас есть предварительное обоснование, написанное понятным языком заранее. Несмотря на то, что моя компания следит за FBFS, мне разрешено получать бонусные выпуски или дополнительные акции, которые я могу сразу продать. Они зачтены против самых последних купленных акций, а не тех, которые я держал в течение Х лет (это часто удобно для минимизации подлежащих уплате налогов).

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

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

Я бы никогда не сохранил среднюю цену. Я предпочитаю количество, цену за акцию и брокерские расходы. Любая другая цифра может быть рассчитана из этих трех, например:

AvgPrice = (Brokerage + SharePrice * ShareQuant) / ShareQuant

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

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


Обновление: Если, как вы указываете, вы собираетесь хранить сводную информацию только для каждой компании, я бы сказал следующее:

Companies:
    CompanyId primary key
    CompanyCode indexed
    CompanyName
    CompanyBuyQuant
    CompanyBuyAvgPrice
    CompanySellQuant
    CompanySellAvgPrice

Затем вы обновляете отдельные столбцы в зависимости от того, покупаете ли вы или продаете. Вам не нужна отдельная строка для покупки / продажи. При первом добавлении компании количество и цены устанавливаются на 0.

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

Итак, следующая таблица:

Companies:
    CompanyId primary key
    CompanyCode indexed
    CompanyName
    CompanyBuyQuant
    CompanyBuyValue
    CompanySellQuant
    CompanySellValue
  • При добавлении компании установите для всех величин и значений значение 0,
  • При покупке M акций по N долларов каждая добавьте M к CompanyBuyQuant и N * M к CompanyBuyValue.
  • При продаже M акций по N долларов каждая добавьте M к CompanySellQuant и N * M к CompanySellValue.
  • Получить среднюю цену покупки как CompanyBuyValue / CompanyBuyQuant.
  • Получить среднюю цену продажи как CompanySellValue / CompanySellQuant.
3 голосов
/ 15 мая 2010

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

2 голосов
/ 15 мая 2010

Один стол. Каждая строка / предмет является сделкой, будь то покупка или продажа.

Кроме того, совокупность столбца количества даст вам вашу текущую позицию. И наличные тоже (-1 х количество х цена **) агрегированы.

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

** наличными: когда вы продаете (отрицательное количество), вы получаете наличные обратно (положительное количество), следовательно, -1 множитель в случае, если кто-либо задается вопросом

2 голосов
/ 15 мая 2010

Я бы пошел с одним столом.

Вы можете использовать отрицательные количества для обозначения продажи. Это довольно стандартный вид индикации. Вычитание аналогично добавлению отрицательного числа!

1 голос
/ 15 мая 2010

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

Если вы просто хотите записать свое владение («позиция» может быть более подходящим словом, если вы можете быть коротким), то я бы просто записал для каждой акции количество удерживаемых. Вы упоминаете среднюю цену, но я буду осторожен с этим, если вы ожидаете, что в любой момент сможете продать часть холдинга. Какова средняя цена, если вы покупаете 100 по 50, 100 по 60 и продаете 50 по 70?

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

...