2012-05-14 51 views
5

tôi hy vọng bạn có thể giúp tôi ở đây - tôi có một câu hỏi về việc thiết kế một bảng SQL. Tôi biết cách viết vào một cơ sở dữ liệu và thực hiện các truy vấn bằng C#, nhưng tôi chưa bao giờ thực sự phải thiết kế một. Vì vậy, tôi nghĩ rằng tôi sẽ cho nó một shot chỉ quan tâm của chúng tôi.Thiết kế bảng cho SQL

Giả sử tôi có bảng có tên family_surname. Trong bảng đó, có thể có x số lượng family_members, nói rằng từ 2 người đến 22 người. Làm cách nào tôi có thể tham chiếu family_members với family_surname?

Vì vậy, tôi sẽ phải GIA ĐÌNH HỌ Smith, Jones, Nâu, Taylor, , vv

Và sau đó Smith có thể có 5 thành viên, đến nơi mà tôi muốn ghi lại tuổi, chiều cao, cân nặng , bất cứ điều gì. Jones có thể có 8 thành viên - nó có thể khác nhau giữa các gia đình.

Tôi không thực sự muốn họ được liệt kê 8 lần cho mỗi thành viên - lý tưởng là hàng họ sẽ tham chiếu (hoặc bằng cách nào đó trỏ tới) một hàng tương ứng trong bảng khác. Và đó là nơi tôi gặp rắc rối!

Tôi hy vọng tôi có ý nghĩa; như tôi nói, im chỉ quan tâm, nhưng tôi muốn biết làm thế nào để làm điều này với hai bảng.

Dù sao, cảm ơn sự giúp đỡ của bạn, tôi đánh giá cao điều đó.

EDIT Cảm ơn bạn đã từng nhận xét - chắc chắn là một số thông tin hữu ích ở đây, mà tôi đánh giá cao. Im đọc và nghiên cứu một số bit và các bit SQL, và cho đến nay nó khá tốt. Cảm ơn một lần nữa, các bạn!

+1

Bạn có lẽ nên đọc về bình thường hóa cơ sở dữ liệu: http://en.wikipedia.org/wiki/Database_normalization –

+0

Điều gì sẽ xảy ra nếu một trong các thành viên trong gia đình bạn muốn thay đổi họ? Giống như ly dị? Nếu một thực thể sở hữu một thuộc tính độc quyền, tôi sẽ không bình thường hóa nó và đưa vào bảng riêng biệt. –

+0

@val là một điểm hợp lệ nhưng có thể nằm ngoài phạm vi của câu hỏi; OP chỉ yêu cầu làm thế nào để đại diện cho một danh sách các cặp tên/họ đã cho mà không cần sao chép họ. Cho dù đó là thích hợp sẽ phụ thuộc vào ứng dụng. – gcbenison

Trả lời

3

Điều bạn đang hỏi là một câu hỏi về việc chuẩn hóa. Bảng sẽ trông giống như:

Create table surname (
    SurnameID int, 
    Surname varchar(255) 
) 

Các bảng khác sẽ tham chiếu họ bằng cách sử dụng tôi. Ngoài ra, bạn có thể muốn họ là duy nhất, một khóa chính và tăng tự động. Đó là những chủ đề nâng cao hơn.

Điều đó nói rằng, tôi không chắc họ là một ứng cử viên tuyệt vời cho việc tách ra như thế này. Một lý do để bình thường hóa dữ liệu là duy trì tính toàn vẹn quan hệ. Trong trường hợp này, nó có nghĩa là khi bạn thay đổi "Smith" thành "Jones", tất cả các thay đổi của Smith cùng một lúc. Tôi không nghĩ rằng đây là một mối quan tâm trong trường hợp của bạn.

2

Có những câu trả lời trước về tìm hiểu về chuẩn hóa dữ liệu có lẽ là chính xác nhưng đối với người mới bắt đầu ....

Breaking xuống tên của người đó (đầu tiên và cuối cùng) có lẽ là một chút nhiều. Trừ khi bạn đang giả định tất cả mọi người có tên là "jones" là ALL liên quan. Hãy suy nghĩ về mỗi bảng như một thực thể/đối tượng và cố gắng kết nối chúng với các đối tượng "thực" càng nhiều càng tốt. Vì một người cần cả tên và họ (tối thiểu) để nhận dạng duy nhất chúng, chúng không nên được chuẩn hóa theo cách đó.

Trong trường hợp bạn đã vẽ, bạn sẽ có bảng Persons có PersonId, FirstName, LastName. Và nếu cần thiết, một bảng riêng biệt để lưu trữ thông tin khác. Tuy nhiên, vì người đó chỉ có thể có một chiều cao, cân nặng, tuổi, v.v ... nên được lưu trữ trong bảng Persons.

Vì vậy, bạn thực sự chỉ cần một bảng tại đây. Trừ khi bạn bắt đầu đi vào số điện thoại, địa chỉ, v.v.

0

Sự phân hủy có thể được thực hiện như sau

  1. CREATE TABLE tên họ (INT ID, HỌ VARCHAR2 (200))
  2. CREATE TABLE CHI TIẾT (ID INT, KEY NƯỚC NGOÀI (SURNAME_ID) Tài liệu tham khảo tên họ (ID) , param1, param2 .....)

Một phác thảo sơ bộ quá trình phân hủy là

Lấy danh sách các thuộc tính (HỌ, param1, param2, ....). Dựa trên danh sách thuộc tính các phím sau đây có thể được suy ra: 1. (HỌ) 2. (param1, param2 ...) Một bảng riêng biệt được tạo ra cho mỗi bộ phím

0

Tôi không thực sự muốn 'họ' được liệt kê 8 lần cho mỗi thành viên

Tại sao? Bạn đã đo về lượng dữ liệu thực tế và xác định đó thực sự là một vấn đề?

Trừ khi bạn có kế hoạch có dữ liệu bổ sung cụ thể đối với họ (và độc lập của người có họ mà), không có gì sai về họ không là trong bảng riêng của mình. Bạn không phá vỡ bất kỳ hình thức bình thường nào.

Trong thực tế, những gì bạn đề nghị có thể là một ý tưởng thực sự xấu, vì những lý do sau đây:

  • Trước hết, bạn cần JOIN chỉ để tìm hiểu họ của người - xấu cho hiệu suất.
  • Nó làm phức tạp (và làm chậm) chèn/sửa đổi/xóa người.
    • Khi chèn một người mới, bạn phải tìm bảng họ để quyết định xem bạn có thể "tái sử dụng" bảng hiện tại hoặc chèn bảng mới hay không.
    • Sửa đổi (ví dụ: khi vợ lấy họ của chồng) là kết hợp xóa (xem bên dưới) và chèn.
    • Họ có tồn tại mà không có người nào có nó không? Nếu không, không có tính toàn vẹn khai báo tốt để thực thi điều này. Tốt nhất bạn cần phải viết một số kích hoạt.
  • Bạn có thể không tiết kiệm được nhiều dung lượng - bảng bổ sung sẽ có chi phí lưu trữ riêng (chẳng hạn như chỉ mục "bên dưới" khóa chính) có thể "ăn" phần lớn lưu trữ được mong đợi .
Các vấn đề liên quan