Ответы пользователя по тегу Проектирование баз данных
  • Какая структура БД для хранения телефонов людей и компаний?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Вопросы по физической модели:
    • У телефона владелец. А разговаривать вы будете с человеком? На одном квартирном телефоне несколько человек.
    • У компании есть голос? Или вы будете разговаривать с человеком?


    По физической модели можно предложить:
    Диаграмма
    5c78298a91816782867472.png
    SELECT Company.Name AS CompanyName, 
           Person.Name AS PersonName, 
           PhoneStorage.Description, 
           Phone.Number, 
           Phone.Description AS PhoneDescription
      FROM PhoneStorage 
        INNER JOIN Phone ON PhoneStorage.Phone = Phone.ID 
        LEFT OUTER JOIN Person ON PhoneStorage.Person = Person.ID 
        LEFT OUTER JOIN Company ON PhoneStorage.Company = Company.ID
      ORDER BY Phone.Number, PersonName
    5c78bfdd1ea5a524322008.png
    Ответ написан
  • Возможно ли привязать сессию с опросом?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Как именно осуществить эту самую анонимность?
    Не привязывать отвечающего к сессии. Только уникальное имя (сотрудник выбирает сам) и пароль.
    Ответ написан
  • Хочу услышать мнения по поводу скриптов?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Players_Tournaments лишняя, все игроки турнира есть в Matches.
    Даты в Tournaments не нужны, все даты есть в Matches.

    Дополнительно: не экономьте символы, все поля можно называть полным именем.
    Ответ написан
    Комментировать
  • Правильно ли созданы связи между таблицами?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Вряд ли разные поставщики привозят продукт по одной цене. Цена в таблицу поставки продукта (ProductSupplier).
    Если поставщик привозит продукт несколько раз, то в таблицу поставки (ProductSupplier) добавить дату и количество.
    Ответ написан
    Комментировать
  • Как правильно спроектировать БД музыкального сервиса(сайт)?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Не доделаны стили (нет справочника) и тип альбома также.

    есть решение лучше?
    Для стриминга хватит.
    Ответ написан
    1 комментарий
  • Правильная структура для хранения посещаемости?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    1С ЗУП. Если "посещаемость" (работать не обязательно) нужна для расчёта зарплаты.

    Максим Кузнецов:
    рабочего графика
    И так, "структура для хранения посещаемости" не является первичной для построения модели данных. Первичной является структура рабочего графика, или учебного плана, или графика работ (для "свободных работников") и прочее. На основании задания строится его выполнение, то есть "посещаемость".
    Ответ написан
    Комментировать
  • Какая структура базы лучше всего подойдет для получения новых записей из базы?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    Потому что оптимизатор включает запрос по индексу. Посмотрите план выполнения.
    Ответ написан
    Комментировать
  • А можно как-то в SQLite организовать связи (1к1, 1 к многи и т.д)?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Внешние ключи.
    Ответ написан
    Комментировать
  • Как создать внешний ключ?

    tsklab
    @tsklab Куратор тега SQL Server
    Здесь отвечаю на вопросы.
    create table EmployeesInfo(
      ID int not null,
      MaritalStatus varchar(10) not null,
      BirthDate date not null,
      [Address] nvarchar(50) not null,
      Phone char(12) not null
    )
    Ответ написан
    Комментировать
  • Какая лучше структура БД для модерации пользователей?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    DELETE FROM Users WHERE (type = 10)
    И дело с концом.
    Ответ написан
  • Как правильно сгененрировать номер фактуры?

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

    оптимистичной блокировкой
    Нет. Нужна пессимистическая.
    Пессимистическая блокировка схожа с принципом Мерфи. Она предполагает, что если что-то плохое может случится, это обязательно случится. В отличии от пессимистической, оптимистическая блокировка предполагает что во время обновления записи в БД мы будем единственными кто ее меняет. В большинстве случаев, так и есть, так что оптимизм оправдан. Тем не менее, во время UPDATE’а мы проверяем наверняка изменилась ли запись с момента ее чтения. И если изменилась, то мы обязаны прочитать последнюю версию записи из БД и повторить нашу операцию с ней.
    Ответ написан
    3 комментария
  • Что почитать, чтобы научиться грамотно проектировать структуру базы данных под большую задачу?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    В больших задачах проект не заканчивается на структуре данных.
    Читать нужно на тему моделирование, хранение и обработка, визуализация данных.
    Ответ написан
    Комментировать
  • Как правильно удалить запись из базы данных?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Есть некая таблица:
    `id`, `name`, `deleted`, `date_create`, `date_delete`
    name - уникальный ключ.
    Убрать уникальность, так как новая запись с одинаковым значением будет новая. Если вам нужно различать записи, добавляйте к NAME "(уд. 13.03.18)".

    Расширенный ответ
    CREATE TABLE [dbo].[CertainTable](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Name] [varchar](100) NOT NULL,
    	[DateCreated] [datetime] NOT NULL,
    	[DateDeleted] [datetime] NULL,
    	[NamePower]  AS (((([Name]+' (')+CONVERT([varchar],[DateCreated],(4)))+isnull('~'+CONVERT([varchar],[DateDeleted],(4)),''))+')'),
    	[IsDeleted]  AS (CONVERT([bit],[DateDeleted])),
     CONSTRAINT [PK_CertainTable] PRIMARY KEY CLUSTERED 
    (
    	[ID] 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
    
    ALTER TABLE [dbo].[CertainTable] ADD  CONSTRAINT [DF_CertainTable_DateCreated]  DEFAULT (getdate()) FOR [DateCreated]
    GO

    Наличие зависимых полей deleted и date_delete — нарушение нормальной формы. Второе оставляем, первое вычисляем. Так же вычисляем наименование с датами.
    Результат:
    1 TEST 2018-03-11 00:00:00.000 2018-03-12 00:00:00.000 TEST (11.03.18~12.03.18) True
    2 TEST 2018-03-13 08:31:19.143 NULL                          TEST (13.03.18)          NULL

    Ответ написан
  • Как правильно конструировать базу данных проекта?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    организация хранения различных старых данных, например 5-10 летней давности
    Зависит от СУБД. Есть встроенные способы: секционированные таблицы.
    Ответ написан
    Комментировать
  • Дизайн БД для сайта фильмо бд?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Сейчас я планирую все видео (фильм, сериал) пихать в 1 таблицу с меткой типа.

    Все фильмы в одной таблице. По типам распределяется в представлении:
    CREATE TABLE [Film](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Heading] [int] NULL,
    	[HeadingName] [varchar](20) NULL,
    	[HeadingClose] [bit] NULL,
    	[SeriesName] [varchar](15) NULL,
    	[Series] [smallint] NULL,
    	[SeriesDigit] [smallint] NULL,
    	[Season] [smallint] NULL,
    	[Episode] [smallint] NULL,
    	[PartName] [varchar](15) NULL,
    	[Part] [smallint] NULL,
    	[HeadingNumber]  AS (isnull(isnull([SeriesName]+' ','серия ')+CONVERT([varchar],[Series]),'')+isnull((('s'+right('00'+CONVERT([varchar],[Season]),(2)))+'e')+right('00'+CONVERT([varchar],[Episode]),(2)),'')),
    	[Serias] [smallint] NULL,
    	[Article] [varchar](20) NULL,
    	[Name] [varchar](200) NULL,
    	[NameTranslat] [varchar](200) NULL,
    	[Year] [smallint] NULL,
    	[Premiere] [smalldatetime] NULL,
    	[Country] [varchar](50) NULL,
    	[Addition] [varchar](200) NULL,
    	[TitleArticleLess]  AS ((([Name]+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),'')),
    	[TitleBase]  AS ((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),'')),
    	[TitleYear]  AS (((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+CONVERT([varchar],[Year],(104)),'')),
    	[TitleCountry]  AS (((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+[Country],'')),
    	[TitleYearCountry]  AS ((((((isnull([Article]+' ','')+[Name])+isnull((' ('+[NameTranslat])+')',''))+isnull((' ['+[Addition])+']',''))+isnull(((', '+isnull([PartName],'часть'))+' ')+CONVERT([varchar],[Part]),''))+isnull(' · '+CONVERT([varchar],[Year],(104)),''))+isnull(' · '+[Country],'')),
    	[Cover] [image] NULL,
    	[Note] [text] NULL,
    	[NotWatch] [bit] NULL,
    	[LastWatch] [datetime] NULL,
    	[DateWatch] [datetime] NULL,
    	[WatchDisplay]  AS (isnull('+ '+CONVERT([varchar],[DateWatch],(104)),'')+isnull(case when [DateWatch] IS NULL then CONVERT([varchar],[LastWatch],(104)) else (' ('+CONVERT([varchar],[LastWatch],(104)))+')' end,'')),
    	[Range]  AS ((((((isnull(CONVERT([varchar](4),[Year]),'1895')+right('00'+CONVERT([varchar],isnull([Series],(0))),(3)))+right('00'+CONVERT([varchar],isnull([Season],(0))),(3)))+right('00'+CONVERT([varchar],isnull([Episode],(0))),(3)))+isnull(CONVERT([varchar](8),[Premiere],(112)),'00000000'))+right('00'+CONVERT([varchar],isnull([Part],(0))),(3)))+isnull(upper([Name]),'')),
    	[SearchValue]  AS (replace(rtrim([Name]),' ','+')),
    	[Icon]  AS (CONVERT([bit],isnull(datalength([Note]),(0)),(0))+CONVERT([bit],isnull(datalength([Cover]),(0)),(0))*(2)),
    	[AttributeIcon] [bit] NULL,
     CONSTRAINT [PK_Film] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [Film] ADD  CONSTRAINT [DF_Film_AttributeIcon]  DEFAULT ((0)) FOR [AttributeIcon]
    GO
    ALTER TABLE [Film]  WITH CHECK ADD  CONSTRAINT [FK_Film_Film] FOREIGN KEY([Heading])
    REFERENCES [dbo].[Film] ([ID])
    GO
    ALTER TABLE [Film] CHECK CONSTRAINT [FK_Film_Film]
    GO

    Всех актеров, команду (режис., сценарист, и т.д.)

    Все атрибуты фильма в нескольких таблицах.
    Группы атрибутов
    CREATE TABLE [FilmAttributeGroup](
    	[ID] [smallint] IDENTITY(1,1) NOT NULL,
    	[Name] [varchar](50) NOT NULL,
    	[Person] [bit] NULL,
    	[Under] [bit] NULL,
    	[Range] [smallint] NOT NULL,
    	[Uses] [int] NOT NULL,
     CONSTRAINT [PK_FilmAttributeGroup] PRIMARY KEY CLUSTERED 
    (
    	[ID] 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
    ALTER TABLE [FilmAttributeGroup] ADD  CONSTRAINT [DF_FilmAttributeGroup_Range]  DEFAULT ((0)) FOR [Range]
    GO
    ALTER TABLE [FilmAttributeGroup] ADD  CONSTRAINT [DF_FilmAttributeGroup_Uses]  DEFAULT ((0)) FOR [Uses]
    GO

    Значения атрибутов
    CREATE TABLE [FilmAttributeValue](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Group] [smallint] NOT NULL,
    	[Value] [varchar](300) NOT NULL,
    	[ValueLeft]  AS (rtrim(case when charindex('(',[Value])>(0) then left([Value],charindex('(',[Value])-(1)) else [Value] end)),
    	[ValueRight]  AS (rtrim(case when charindex('(',[Value])>(0) then substring([Value],charindex('(',[Value])+(1),(charindex(')',[Value])-charindex('(',[Value]))-(1))  end)),
    	[SearchValue]  AS (replace(rtrim(case when charindex('(',[Value])>(0) then left([Value],charindex('(',[Value])-(1)) else [Value] end),' ','+')),
    	[Person] [int] NULL,
    	[Equalize] [bit] NOT NULL,
    	[Uses] [int] NULL,
     CONSTRAINT [PK_FilmAttributeValue] PRIMARY KEY CLUSTERED 
    (
    	[ID] 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
    ALTER TABLE [FilmAttributeValue] ADD  CONSTRAINT [DF_FilmAttributeValue_Equalize]  DEFAULT ((1)) FOR [Equalize]
    GO
    ALTER TABLE [FilmAttributeValue]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttributeValue_FilmAttributeGroup] FOREIGN KEY([Group])
    REFERENCES [dbo].[FilmAttributeGroup] ([ID])
    ON DELETE CASCADE
    GO
    ALTER TABLE [FilmAttributeValue] CHECK CONSTRAINT [FK_FilmAttributeValue_FilmAttributeGroup]
    GO
    ALTER TABLE [FilmAttributeValue]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttributeValue_Person] FOREIGN KEY([Person])
    REFERENCES [dbo].[Person] ([ID])
    ON DELETE SET NULL
    GO
    ALTER TABLE [FilmAttributeValue] CHECK CONSTRAINT [FK_FilmAttributeValue_Person]
    GO

    Атрибуты фильма
    REATE TABLE [FilmAttribute](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[Film] [int] NOT NULL,
    	[Attribute] [int] NOT NULL,
    	[Addition] [varchar](250) NULL,
    	[GroupEdit] [int] NULL,
     CONSTRAINT [PK_FilmAttribute] PRIMARY KEY CLUSTERED 
    (
    	[ID] 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
    ALTER TABLE [FilmAttribute]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttribute_Film] FOREIGN KEY([Film])
    REFERENCES [dbo].[Film] ([ID])
    GO
    ALTER TABLE [FilmAttribute] CHECK CONSTRAINT [FK_FilmAttribute_Film]
    GO
    ALTER TABLE [FilmAttribute]  WITH CHECK ADD  CONSTRAINT [FK_FilmAttribute_FilmAttributeValue] FOREIGN KEY([Attribute])
    REFERENCES [dbo].[FilmAttributeValue] ([ID])
    GO
    ALTER TABLE [FilmAttribute] CHECK CONSTRAINT [FK_FilmAttribute_FilmAttributeValue]
    GO

    Персоны
    CREATE TABLE [Person](
    	[ID] [int] IDENTITY(1,1) NOT NULL,
    	[FirstName] [varchar](100) NULL,
    	[LastName] [varchar](100) NOT NULL,
    	[NameRussian] [varchar](200) NULL,
    	[BirthDay] [smalldatetime] NULL,
    	[BirthPlace] [varchar](100) NULL,
    	[DeathDay] [smalldatetime] NULL,
    	[DeathPlace] [varchar](100) NULL,
    	[Text] [text] NULL,
    	[Picture] [image] NULL,
    	[Uses] [int] NULL,
    	[NameFull]  AS ((isnull([FirstName]+' ','')+ltrim([LastName]))+isnull((' ('+[NameRussian])+')','')),
    	[NameOrder]  AS ((ltrim([LastName])+isnull(', '+[FirstName],''))+isnull((' ('+[NameRussian])+')','')),
    	[SearchValue]  AS (isnull(replace([FirstName],' ','+')+'+','')+replace([LastName],' ','+')),
    	[NoteIcon]  AS (CONVERT([bit],isnull(datalength([Text]),(0)),(0))+CONVERT([bit],isnull(datalength([Picture]),(0)),(0))*(2)),
    	[Key]  AS ('P'+CONVERT([varchar],[ID])),
     CONSTRAINT [PK_Performer] PRIMARY KEY CLUSTERED 
    (
    	[ID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
    GO
    ALTER TABLE [Person] ADD  CONSTRAINT [DF_Person_Uses]  DEFAULT ((0)) FOR [Uses]
    GO
    Ответ написан
    Комментировать
  • Что подразумевает это задание?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    Имеется ввиду, что большинство систем (сказать "все" — самонадеянно) регистрируют человека по паспорту. Несовершеннолетний ребенок не имеет паспорта, а вписан в паспорт родителей. Соответственно все действия нужно проводить по паспорту родителя, что бы не вводить для этих детей отдельную сущность по регистрации по свидетельству о рождении.
    Ответ написан
    Комментировать