Лучший дизайн базы данных - PullRequest
0 голосов
/ 26 февраля 2011

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

Структура 1: Клиент имеет пенсионный фонд, который напрямую инвестирует в паевые инвестиционные фонды / паевые целевые фонды. Эти взаимные фонды, в свою очередь, инвестируют в ценные бумаги, такие как котирующиеся на бирже акции.
Структура 2: Клиент имеет пенсионный фонд, который инвестирует в комбинацию внутренних портфелей (фондов), которые, в свою очередь, инвестируют в паевые инвестиционные фонды (которые инвестируют в ценные бумаги).

Очень легко обслуживать структуру 1, а также просто обслуживать структуру 2. Однако некоторые клиенты будут использовать структуру 1, а другие - структуру 2, и я не хочу, чтобы у них были отдельные запросы и отчеты для них. Один из вариантов, о котором я подумал, - это разработать для Структуры 2, и если клиент находится в Структуре 1, включить «фиктивный» внутренний портфель. Например, в приведенном ниже примере Пенсионный фонд 1 структурирован в соответствии со структурой 1, а Пенсионный фонд 3 структурирован в соответствии со структурой 2 с использованием фиктивного внутреннего портфеля. Смотрите представления vw_Structure1 и vw_Structure2.

Я ищу лучший способ сделать это. Есть идеи?

PS: Кажется, проблема с публикацией DDL, поэтому оставит остаток как новое сообщение

SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
CREATE TABLE [2-InternalPortfolio](  
    [InternalPortfolioID] [int] IDENTITY(1,1) NOT NULL,  
    [InternalPortfolioName] [varchar](50) NOT NULL,  
 CONSTRAINT [PK_2-InternalPortfolio] PRIMARY KEY CLUSTERED   
(  
    [InternalPortfolioID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]  
GO  
SET IDENTITY_INSERT [2-InternalPortfolio] ON  
INSERT [2-InternalPortfolio] ([InternalPortfolioID], [InternalPortfolioName]) VALUES (1, N'High Growth')  
INSERT [2-InternalPortfolio] ([InternalPortfolioID], [InternalPortfolioName]) VALUES (2, N'Conservative')  
INSERT [2-InternalPortfolio] ([InternalPortfolioID], [InternalPortfolioName]) VALUES (3, N'Dummy Internal Portfolio')  
SET IDENTITY_INSERT [2-InternalPortfolio] OFF  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  
CREATE TABLE [Security](  
    [SecurityID] [int] IDENTITY(1,1) NOT NULL,  
    [SecurityName] [varchar](50) NOT NULL,  
 CONSTRAINT [PK_Security] PRIMARY KEY CLUSTERED   
(  
    [SecurityID] ASC  
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]  
) ON [PRIMARY]  
GO  
SET IDENTITY_INSERT [Security] ON  
INSERT [Security] ([SecurityID], [SecurityName]) VALUES (1, N'Company 1')  
INSERT [Security] ([SecurityID], [SecurityName]) VALUES (2, N'Company 2')  
INSERT [Security] ([SecurityID], [SecurityName]) VALUES (3, N'Company 3')  
INSERT [Security] ([SecurityID], [SecurityName]) VALUES (4, N'Company 4')  
SET IDENTITY_INSERT [Security] OFF  
SET ANSI_NULLS ON  
GO  
SET QUOTED_IDENTIFIER ON  
GO  

1 Ответ

1 голос
/ 27 февраля 2011

На самом деле это сводится к бизнес-правилам.

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

Если они в основном совпадают, SEC рассматривает их аналогично и т. Д., Тогда я бы использовалшаблон проектирования, аналогичный тому, который производственная организация использовала бы для сборок и сборок продукта (поиск «Модель данных ведомости материалов»), или шаблон проектирования с единой таблицей для сотрудников и их менеджеров (где ManagerID сотрудника - это идентификатор сотрудника ихManager).

...