2013-02-23 72 views
8

Vì vậy, tôi phải để tạo ra sơ đồ này + các mối quan hệ chính xác cách ERD này miêu tả nó. Ở đây tôi chỉ hiển thị các bảng mà tôi đang gặp vấn đề với:Tạo bảng PostgreSQL + mối quan hệ - CÁC VẤN ĐỀ với các mối quan hệ - One to One

I am supposed to have ONE TO ONE but I get ONE TO MANY

Vì vậy, tôi đang cố gắng để làm cho nó 1-1 nhưng đối với một số lý do, không có vấn đề gì tôi thay đổi, tôi nhận được một đến nhiều trên bất cứ điều gì bảng có khóa ngoại.

Đây là sql của tôi cho hai bảng này.

 CREATE TABLE lab4.factory(

      factory_id  INTEGER   UNIQUE, 
      address   VARCHAR(100) NOT NULL, 
      PRIMARY KEY (factory_id) 

     ); 

     CREATE TABLE lab4.employee(

      employee_id  INTEGER   UNIQUE, 
      employee_name VARCHAR(100) NOT NULL, 
      factory_id  INTEGER   REFERENCES  lab4.factory(factory_id), 
      PRIMARY KEY (employee_id) 

     ); 

Ở đây tôi cũng nhận được điều tương tự. Tôi không nhận được mối quan hệ một, nhưng một đến nhiều. Invoiceline là một thực thể yếu.

it needs to be ONE TO ONE

Và đây là mã của tôi cho hình ảnh thứ hai.

 CREATE TABLE lab4.product(

      product_id  INTEGER  PRIMARY KEY, 
      product_name INTEGER  NOT NULL 

     ); 


     CREATE TABLE lab4.invoiceLine(

      line_number  INTEGER  NOT NULL, 
      quantity  INTEGER  NOT NULL, 
      curr_price  INTEGER  NOT NULL, 
      inv_no   INTEGER  REFERENCES  invoice, 
      product_id  INTEGER  REFERENCES  lab4.product(product_id), 
      PRIMARY KEY (inv_no, line_number) 

     ); 

Tôi sẽ đánh giá cao bất kỳ trợ giúp nào. Cảm ơn.

+1

Bạn mong đợi mối quan hệ 1: 1 được mô hình hóa như thế nào? Với một ràng buộc 'UNIQUE' trên cột khóa ngoài? Với một ràng buộc chìa khóa nước ngoài có thể trì hoãn đối ứng? –

+0

@CraigRinger, tôi ước tôi có cơ sở kiến ​​thức để trả lời câu hỏi của bạn, nhưng tôi chỉ đơn giản là một vài bài giảng trong lớp DB đầu tiên của tôi. Câu hỏi của tôi là như sau: Làm cách nào để tạo mối quan hệ một đến một? Vì lý do nào đó, chúng tôi đã nói chuyện chủ yếu về nhiều người và một đến nhiều người –

Trả lời

22

One-to-one không được cũng thể hiện dưới dạng một loại mối quan hệ đầu tiên hạng nhất trong SQL chuẩn. Giống như nhiều-nhiều, đạt được bằng cách sử dụng một bảng kết nối và hai mối quan hệ một-nhiều, không có sự thật "một đối một" trong SQL.

Có một vài lựa chọn:

  • Tạo một bình thường ràng buộc khoá ngoại ("một đến nhiều" phong cách) và sau đó thêm một hạn chế UNIQUE trên cột FK ám. Điều này có nghĩa là không nhiều hơn một giá trị được gọi đến có thể xuất hiện trong cột giới thiệu, làm cho nó trở thành tùy chọn một đối một. Đây là một cách tiếp cận khá đơn giản và khá khoan dung hoạt động tốt.

  • Sử dụng một FK mối quan hệ bình thường mà có thể mô hình 1: m, và để cho ứng dụng của bạn đảm bảo nó chỉ từng 1: 1 trong thực tế. Tôi không đề nghị điều này, chỉ có một nhược điểm hiệu suất viết nhỏ để thêm chỉ mục duy nhất FK và giúp đảm bảo tính hợp lệ của dữ liệu, tìm lỗi ứng dụng và tránh nhầm lẫn người khác cần sửa đổi lược đồ sau này.

  • Tạo phím nước ngoài đối ứng - có thể chỉ nếu cơ sở dữ liệu của bạn hỗ trợ deferrable ràng buộc khoá ngoại. Điều này phức tạp hơn một chút để mã hóa, nhưng cho phép bạn thực hiện các mối quan hệ bắt buộc một-một. Mỗi thực thể có tham chiếu khóa ngoài với PK của người khác trong một cột duy nhất. Một hoặc cả hai trở ngại phải DEFERRABLE và một trong hai INITIALLY DEFERRED hoặc sử dụng với một cuộc gọi SET CONSTRAINTS, vì bạn phải trì hoãn một trong những hạn chế kiểm tra để thiết lập phụ thuộc vòng tròn. Đây là một kỹ thuật khá tiên tiến, không cần thiết cho phần lớn các ứng dụng.

  • Sử dụng trình kích hoạt trước khi xác thực nếu cơ sở dữ liệu hỗ trợ, vì vậy bạn có thể xác minh rằng khi thực thể A được chèn chính xác một thực thể B cũng được chèn vào và ngược lại, với các kiểm tra tương ứng để cập nhật và xóa. Điều này có thể chậm và thường không cần thiết, cộng với nhiều hệ thống cơ sở dữ liệu không hỗ trợ trình kích hoạt trước cam kết.

+0

vì vậy trong trường hợp của tôi, factory_id sẽ phải là UNIQUE vì tôi có nó được bàn nhân viên tham khảo? –

+0

@GeorgiAngelov Có, 'lab4.employee.factory_id' * bên tham chiếu * có thể được đánh dấu 'UNIQUE'. Hãy suy nghĩ về nó: Một cột FK duy nhất có thể chứa nhiều nhất một trong mỗi giá trị của cột PK được gọi. Chỉ cần nói 'factory_id' khi bạn sử dụng tên đó nhiều hơn một nơi giống như nói" lên máy bay Quantas "tại sân bay - * máy bay nào? * Lưu ý rằng điều này tạo ra một mối quan hệ * tùy chọn * ở phía giới thiệu ; * nhiều nhất * một nhân viên có thể quản lý một nhà máy, nhưng không yêu cầu bất kỳ nhà máy nào có một người quản lý. –

+0

cảm ơn. Điều này thực sự làm rõ mọi thứ. Tôi đánh giá cao sự giúp đỡ của bạn. –

Các vấn đề liên quan