Re: [SQL ] 新手求助,總數上限不確定的資料欄位

作者: BigLoser (大魯蛇)   2014-09-21 20:19:32
※ 引述《meowyih (meowyih)》之銘言:
: 資料庫名稱:MySQL
: 我只有非常基本的資料庫的經驗,如果問題太笨,請見諒 m(_ _)m
: 舉例來說,假設一個人的 TABLE 的欄位有名字、地址、和個人照片:
: 但是因為某些原因,我們被要求一個人的圖片和地址的總數不能有上限,
: 有人可能沒圖片與地址,有人可能有上百個圖片和地址,
: 請問這種情況的 TABLE 要長成什麼樣,或是資料庫要怎麼設計呢?
這位溫拿你好,可以參考一下本魯蛇的做法,
因為這個狀況中,地址和個人照片是相似的東西,所以本魯蛇只拿其中一個做舉例,
這個資料庫,需要至少兩個資料表:
1.人資料表,用來存放這個人的資訊
2.地址資料表,用來存放所有人的地址,而其中會有一個欄位與人資料表
  相關聯,來表明這個(一或多個)地址屬於哪個人。
人資料表
主索引鍵 姓名
50 勝文
地址資料表
主索引鍵 人資料表索引鍵 地址
100 50 台北帝寶
101 50 美國帝寶
當你有了這樣的資料,就可以利用join的技巧,查出某個人擁有那些帝寶了。
這邊是查詢語法:
select 人資料表.姓名, 地址資料表.地址 from 人資料表
left join 地址資料表 on 人資料表.主索引鍵 = 地址資料表.人資料表索引鍵
where 人資料表.主索引鍵 = 50
結果會是:
姓名   地址
勝文 台北帝寶
勝文   美國帝寶
因為本魯蛇沒有把檔案放到過網路上,所以就直接把指令碼貼出來了,
希望有善心人士可以推薦本魯蛇一個方便其他人下載檔案的方式。
以下是這個資料庫的指令碼:
USE [批踢踢資料庫板]
GO
/****** Object: Table [dbo].[人資料表] Script Date: 2014/9/21 下午
08:16:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[人資料表](
[主索引鍵] [int] NOT NULL,
[姓名] [nvarchar](20) NOT NULL,
CONSTRAINT [PK_人資料表] PRIMARY KEY CLUSTERED
(
[主索引鍵] 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
/****** Object: Table [dbo].[地址資料表] Script Date: 2014/9/21 下午
08:16:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[地址資料表](
[主索引鍵] [int] NOT NULL,
[人資料表索引鍵] [int] NOT NULL,
[地址] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_地址資料表] PRIMARY KEY CLUSTERED
(
[主索引鍵] 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
INSERT [dbo].[人資料表] ([主索引鍵], [姓名]) VALUES (50, N'勝文')
INSERT [dbo].[地址資料表] ([主索引鍵], [人資料表索引鍵], [地址]) VALUES (100,
50, N'台北帝寶')
INSERT [dbo].[地址資料表] ([主索引鍵], [人資料表索引鍵], [地址]) VALUES (101,
50, N'美國帝寶')
作者: meowyih (meowyih)   2014-09-21 20:35:00
受教了! 非常感謝這篇清楚又詳細的說明! m(_ _)m
作者: BigLoser (大魯蛇)   2014-09-21 20:35:00
阿,我這兩個資料表沒設關聯,請溫拿們自己設定
作者: lasda (板橋金城武拉斯達)   2014-09-22 18:18:00
絕對不接受垃圾

Links booklink

Contact Us: admin [ a t ] ucptt.com