Я не уверен, что вам нужно различать компании и людей; только зарегистрированные и незарегистрированные авторы.
Я добавил это для ясности. Вы можете просто использовать проверочное ограничение для таблицы авторов, чтобы ограничить значения U и R.
Create Table dbo.AuthorRegisteredStates
(
Code char(1) not null Primary Key Clustered
, Name nvarchar(15) not null
, Constraint UK_AuthorRegisteredState Unique ( [Name])
)
Insert dbo.AuthorRegisteredState(Code, Name) Values('U', 'Unregistered')
Insert dbo.AuthorRegisteredState(Code, Name) Values('R', 'Registered')
GO
Ключ в любой системе баз данных - целостность данных. Итак, мы хотим убедиться, что имена пользователей уникальны и, возможно, что имена уникальны. Вы хотите, чтобы два человека с одинаковым именем опубликовали статью? Как читатель будет их различать? Обратите внимание, что мне все равно, представляет ли Автор компанию или человека. Если кто-то регистрирует компанию или человека, они могут указать имя и фамилию, если захотят. Однако требуется, чтобы все вводили имя (воспринимайте его как отображаемое имя). Мы никогда не будем искать авторов на основании чего-либо, кроме имени.
Create Table dbo.Authors
(
Id int not null identity(1,1) Primary Key Clustered
, AuthorStateCode char(1) not null
, Name nvarchar(100) not null
, Email nvarchar(300) null
, Username nvarchar(20) not null
, PasswordHash nvarchar(50) not null
, FirstName nvarchar(25) null
, LastName nvarchar(25) null
...
, Address nvarchar(max) null
, City nvarchar(40) null
...
, Website nvarchar(max) null
, Constraint UK_Authors_Name Unique ( [Name] )
, Constraint UK_Authors_Username Unique ( [Username] )
, Constraint FK_Authors_AuthorRegisteredStates
Foreign Key ( AuthorStateCode )
References dbo.AuthorRegisteredStates ( Code )
-- optional. if you really wanted to ensure that an author that was unregistered
-- had a firstname and lastname. However, I'd recommend enforcing this in the GUI
-- if anywhere as it really does not matter if they
-- enter a first name and last name.
-- All that matters is whether they are registered and entered a name.
, Constraint CK_Authors_RegisteredWithFirstNameLastName
Check ( State = 'R' Or ( State = 'U' And FirstName Is Not Null And LastName Is Not Null ) )
)
Может ли один автор опубликовать две статьи в одну и ту же дату и время? Если нет (как я уже догадался здесь), то мы добавляем уникальное ограничение. Вопрос в том, нужно ли вам указывать статью. Какую информацию вы могли бы дать, чтобы найти статью, помимо общей даты ее публикации?
Create Table dbo.Articles
(
Id int not null identity(1,1) Primary Key Clustered
, AuthorId int not null
, PublishedDate datetime not null
, Headline nvarchar(200) not null
, Content nvarchar(max) null
...
, Constraint UK_Articles_PublishedDate Unique ( AuthorId, PublishedDate )
, Constraint FK_Articles_Authors
Foreign Key ( AuthorId )
References dbo.Authors ( Id )
)
Кроме того, я бы добавил индекс на ОпубликованоDate для улучшения поиска по дате.
Create Index IX_Articles_PublishedDate dbo.Articles On ( PublishedDate )
Я бы также включил свободный текстовый поиск для поиска по содержанию статей.
Я думаю, что опасения по поводу "пустого пространства", вероятно, преждевременные оптимизации Влияние на производительность будет ноль. Это тот случай, когда небольшое количество денормализации ничего не стоит вам с точки зрения производительности и выигрывает с точки зрения развития. Однако, если это действительно вас касается, вы можете переместить информацию об адресе в таблицу 1: 1 следующим образом:
Create Table dbo.AuthorAddresses
(
AuthorId int not null Primary Key Clustered
, Street nvarchar(max) not null
, City nvarchar(40) not null
...
, Constraint FK_AuthorAddresses_Authors
Foreign Key ( AuthorId )
References dbo.Authors( Id )
)
Это добавит небольшую сложность вашему среднему уровню. Как всегда, вопрос заключается в том, превосходит ли удаление некоторого пустого пространства стоимость с точки зрения кодирования и тестирования. Сохраните ли вы эту информацию в виде столбцов в своей таблице авторов или в отдельной таблице, влияние на производительность будет равно нулю.