#sql-server #tsql
#sql-сервер #tsql
Вопрос:
Я использую SQL Server. На данный момент у меня есть две таблицы в моей базе данных.
Одна таблица CmsContents
представляет страницы для моего блога, вторая таблица называется CmsImagesContents
, которая собирает информацию об изображениях, связанных с определенной страницей.
Отношение между двумя таблицами имеет тип One to Many
, на одной странице может быть много изображений, но на одном изображении может быть только одна страница.
Я понимаю, что этот дизайн довольно прост, и я начал осознавать некоторые ограничения, вот мои вопросы:
-
Мне нужно добавить изображение в мою базу данных, прежде чем связывать его со страницей, я не большой поклонник нулевых значений. Какие опции доступны в моем проекте?
-
Не могли бы вы предложить мой дизайн для этого сценария? Знаете ли вы лучшую альтернативу?
Спасибо за вашу помощь!
CREATE TABLE [dbo].[CmsImagesContents](
[ImageContentId] [int] IDENTITY(1,1) NOT NULL,
[ContentId] [int] NOT NULL,
[RowGuid] [uniqueidentifier] NOT NULL,
[Title] [varchar](64) NOT NULL,
[AltTag] [nvarchar](256) NOT NULL,
[Caption] [nvarchar](256) NOT NULL,
[CopyrightNote] [nvarchar](256) NOT NULL,
CONSTRAINT [PK_CmsImagesContents_ImageContentId]
PRIMARY KEY CLUSTERED ([ImageContentId] ASC)
)
ALTER TABLE [dbo].[CmsImagesContents] WITH CHECK
ADD CONSTRAINT [FK_CmsImagesContents_ContentId]
FOREIGN KEY([ContentId]) REFERENCES [dbo].[CmsContents] ([ContentId])
Ответ №1:
Вы могли бы создать пересекающуюся таблицу. Если бы я называл таблицы, они были бы названы
Content
--------
ContentID (PK)
Title
Text
etc...
Image
-----
ImageID (PK)
Size
Title
etc....
ContentImages
--------------
ContentImagesID (PK)
ContentID
ImageID
А теперь добавьте уникальное ограничение на ImageID в ContentImages (чтобы оно могло появиться в пересекающейся) таблице только один раз)
Теперь вы можете добавлять содержимое и изображения по своему усмотрению, а затем связывать изображение с содержимым, заполняя таблицу пересечения
Комментарии:
1. Спасибо Эндрю.. ваш подход имеет смысл в моем контексте!