2012-05-24 25 views
0

爲了我自己的目的,我正在編寫一個計算機輔助學習國外語言的軟件。這是一個閃卡類型的程序。 我剛剛預測了一個數據庫(下面附有SQL腳本)。你能檢查它是否正確嗎?你有其他更好的想法如何解決它?你能建議一些ERD圖嗎? 你對我的數據庫中的表有任何其他想法嗎? 如何存儲音頻和圖像文件?我在mp3中收集的英文單詞大約是300 MB。如果我只在DB中存儲路徑和文件名,我應該如何將文件存儲在硬盤中以防止用戶複製或執行它們。我應該將它作爲二進制文件存儲嗎?例如,以'A'開頭的所有單詞我都存儲在一個文件中,例如稱爲a.bin,在文件b.bin中以'B'開頭的單詞等等。關於數據庫項目的一些問題

在一個崗位這麼多的問題......但我在SQL新,所以我要問的一切,我希望有人會找時間來解釋我所有的疑慮。

謝謝你的一切建議。

立方體

USE [master] 
GO 

IF db_id('FlashcardsDB') IS NOT NULL 
BEGIN 
    DROP DATABASE FlashcardsDB 
END 

CREATE DATABASE FlashcardsDB 
ON 
(
    NAME = 'FlashcardsDB', 
    FILENAME = 'C:\FlashcardsDB.mdf', 
    SIZE = 10, 
    MAXSIZE = 50, 
    FILEGROWTH = 5 
) 
GO 

USE FlashcardsDB 
GO 

CREATE TABLE ForeignLanguage 
( 
    ForeignLanguageID int PRIMARY KEY NOT NULL IDENTITY, 
    Word varchar(50) NOT NULL, 
    PartOfSpeech varchar(20), 
    OwnPhoneticTranscription varchar(20), 
    IPAPhoneticTranscription varchar(20), 
    ExampleOfUsage varchar(100), 
    Definition varchar(100), 
    PictureName varchar(1000), 
    Picture varbinary(max), 
    Audio varbinary(max), 
    Note float NOT NULL 
    CreationDate date 
    ModificationDate date 
    LanguageOfWord varchar(20) 
) 

CREATE TABLE FirstLanguage 
( 
    FirstLanguageID int PRIMARY KEY NOT NULL IDENTITY, 
    ForeignLanguageID int NOT NULL, 
    CONSTRAINT FK_ForeignLanguage_FirstLanguage FOREIGN KEY (ForeignLanguageID) 
    REFERENCES ForeignLanguage(ForeignLanguageID), 
    Word varchar(50) NOT NULL 
) 

DECLARE @newForeignLanguageID int 

INSERT INTO ForeignLanguage 
VALUES 
(
    'to attempt', 
    'verb', 
    'atempt', 
    'atempt', 
    'I attempted to explain it.', 
    'to try to do something, especially something difficult', 
    null, 
    null, 
    null, 
    1.0, 
    null, 
    null, 
    null 
) 
SELECT @newForeignLanguageID = scope_identity() 

INSERT INTO FirstLanguage (ForeignLanguageID, Word) 
VALUES 
(@newForeignLanguageID, 'usiłować') 
+0

檢查是否正確?你到底在問什麼? – FlavorScape

+1

嗨@cube,歡迎來到StackOverflow。您可能想查看[FAQ]並閱讀[問]的部分。這類問題並不屬於這裏 - 它會更好[codereview.se]。 – eggyal

+0

首先我想知道你的flashcard類型項目數據庫的解決方案。你會使用哪些表格,行列,關係?我的解決方案是否正確?也許你會改變/添加/刪除一些東西? – cube

回答

1

首先,你應該正常化你的表。我可以看到,你把每一個單詞放在同一張表中作爲它的語言,發音(作爲音頻文件)和一些圖像(一個標誌?)

請注意,爲了改變一些數據(採用語言名稱) ,你必須修改許多行。此外,刪除所有單詞也會刪除所有來自外語的信息。一種語言應該存在於它的所有表格中,作爲一個單獨的行,可以在一個地方進行編輯,而不需要任何實際的詞語。

這同樣適用於詞類。你可以把它們放在一個單獨的表格中。這樣你就可以輕鬆地維護它們。這將更容易糾正錯別字,添加新值,最後但並非最不重要,檢查新創建的單詞的值與可接受的值的實例列表(您可以定義字段約束,但從表中選擇更靈活,你不會具有被添加詞類的媒體文件可以在單獨的表中存在,以及各時間)

以改變該表。爲什麼要保留所有這些空值,如果你真的需要使用blob和一個外鍵的話,你可以擁有另一個表?它還可以爲單詞或語言提供多個圖像或音頻文件。

將數據拆分爲更多表格。將語言定義保留在一個表中,並將單詞保留在另一個表中

我強烈建議閱讀有關數據庫的正常形式來獲得一個好的設計應該是什麼樣子的要點。從您的示例數據中,我推斷您是波蘭語。有一個關於wazniak.mimuw.edu.pl

我已經看到了一些,這些材料在技術的波茲南大學的體面的在波蘭的數據庫設計講座。如果您想獲得關於此主題的更準確信息,請給我一個消息。

此外,你應該更注重細節,比如數據類型。 VARCHAR(50)可能不足以用於某些外語中的單詞。一些外來詞語更長。帶上63個字母的德國Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz。當你包括像IEnterpriseRindfleischetikettierungsüberwachungsaufgabenübertragungsgesetzCompositeFactoryBuilderAdapterFactoryFacade

PS

編程相關的詞,要求我們的ERD之前,它甚至更糟的是,你可以發佈你向我們展示你的意思。這也是一個很好的練習。

1

這裏有你的一些問題提出了一些建議:在硬盤驅動器

  • 存儲音頻和圖像,而不是數據庫。
  • 如果您擔心有人盜用您的音頻文件,您可以執行以下幾件事:
  • 在音頻文件上傳過程中,將文件名更改爲無描述性文件名。例如 從NationalAnthem.mp3更改爲asjajeww823ewq8wdw8.mp3
  • 爲每個mp3創建一個子文件夾。每個文件夾也應該有一個沒有描述性的名字。並將所有子文件夾放在主MP3文件夾中。 \ MP3 \ sjsdhsd \ sdyndwysxs.mp3
  • 拒絕目錄列表到文件夾的MP3和所有子文件夾
  • 允許用戶看到的只是音樂文件,他們已經訂閱過

這些功能將無法避免用戶竊取您音樂來自他們自己的瀏覽器緩存。一旦他們收聽到文件駐留在電腦中的歌曲。爲了避免這種情況,您可以構建一個像潘多拉之類的自定義Flash播放器,以允許流式傳輸音樂,而不是將文件保存在瀏覽器緩存中。

在你的數據庫:

  • 存儲新的加密文件名,路徑和英語一樣描述
  • 如果你想英語單詞與MP3文件相關聯,那麼你將需要建立一個許多人很多餐桌關係,類似於書店。 Link
0

除了其他的答案,如果你打算存儲外國字符,你會想使用nvarchar而不是varchar。