您应该从Publications表中删除作者,并创建一个链接用户与出版物的第三个表。
PublicationAuthors
PublicationID int
UserID int
然后,您的查询可以检查该表以查看用户是否与发布相关联。此外,您可以根据需要选择尽可能多的作者,而无需为出版物添加新列,并且如果有人更改其名称,则不会破坏与出版物的关系。
下面是一个例子(我使用SQL Server会为这样可能会有小的语法差异):当你意识到我拼错了作者的姓氏
CREATE TABLE Publications(
[PublicationID] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](128) NOT NULL,
[DatePublished] [DateTime]
PRIMARY KEY CLUSTERED
(
[PublicationID] 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
CREATE TABLE Authors(
[AuthorID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](128) NOT NULL,
[LastName] [nvarchar](128) NOT NULL
PRIMARY KEY CLUSTERED
(
[AuthorID] 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
CREATE TABLE PublicationAuthors(
[PublicationID] [int],
[AuthorID] [int]
PRIMARY KEY CLUSTERED
(
[PublicationID] ASC,
[AuthorID]
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO Publications (Title, DatePublished) VALUES ('Sphere', '5/12/1987')
INSERT INTO Publications (Title, DatePublished) VALUES ('Jurassic Park', '11/1/1990')
INSERT INTO Authors (FirstName, LastName) VALUES ('Michael', 'Chricton')
INSERT INTO Authors (FirstName, LastName) VALUES ('Andy', 'McKenna')
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (1, 1)
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (2, 1)
INSERT INTO PublicationAuthors (PublicationID, AuthorID) VALUES (2, 2)
--All Authors for this Publication
SELECT p.Title, p.DatePublished, a.FirstName, a.LastName
FROM Publications p
INNER JOIN PublicationAuthors pa
ON pa.PublicationID = p.PublicationID
INNER JOIN Authors a
ON a.AuthorID = pa.AuthorID
WHERE p.PublicationID = 2
--All Publications for this Author
SELECT p.Title, p.DatePublished, a.FirstName, a.LastName
FROM Authors a
INNER JOIN PublicationAuthors pa
ON pa.AuthorID = a.AuthorID
INNER JOIN Publications p
ON pa.PublicationID = p.PublicationID
WHERE a.AuthorID = 1
然后,你可以只更新一排无触摸出版物表。
谢谢您的解答。 我不确定我是否了解你。 因此,我从Publications表中移除作者并创建下一个表PublicationAuthors。接下来我放在那里:'作者姓名和姓氏,publication_id和user_id'。一位作者可能有许多出版物,并且有可能作者不是用户,所以在这种情况下,我必须在PublicationAuthors表中添加新列。如果作者写了一个新的 – Delicja 2012-01-28 11:21:40
如果作者写了一个新的发布,我应该添加一个新字段 - 一个新的publication_id或者向具有相同作者的表添加一个新记录。 – Delicja 2012-01-28 11:29:12
不,您需要将publication_id从作者/用户表中分离出来。您需要第三个表格,它只是作者到出版物的映射。这样你有1个不同的出版物记录和1个不同的作者记录。如果该作者被附加到另一个出版物,那么你所做的就是向映射表添加一条新记录。在这里阅读更多关于数据标准化的内容:http://en.wikipedia.org/wiki/Database_normalization – AndyMcKenna 2012-01-31 13:17:12